0

レガシーサーバで作業する必要があり、RC4がJava 8から削除されたため、RC4ベースの暗号を再度有効にする必要があります。リリースノートで説明したように、SSLSocket/SSLEngine.setEnabledCipherSuites()を使用する必要があります。 Apache HTTP Clientを使用しているので、これを行う方法を見つけることができませんでした。前もって感謝します! (私はまた、かなりのセミトレーラーの問題を発見したので、新しいものを投稿すると思った)Apache HTTPクライアントを使用する場合、EnabledCipherSuitesを設定するにはどうすればよいですか?

答えて

1

私は同じ問題に直面しており、これを理解することができました。あなたはSecureProtocolSocketFactoryクラスのメソッドpublicソケットのcreateSocket()をオーバーライドする必要があり、 "SecureProtocolSocketFactoryImpl" クラスで

SecureProtocolSocketFactoryImpl protFactory = new SecureProtocolSocketFactoryImpl(); 
httpsClient.getHostConfiguration().setHost(host, port, httpsProtocol); 

。その方法では

あなたはそうそこには以下のような何かを行うことができるようになります。この

SSLSocket soc = (SSLSocket) getSSLContext().getSocketFactory().createSocket(
        socket, 
        host, 
        port, 
        autoClose 
       ); 

のようなソケットを取得します。

ciphersToBeEnabled[0] = "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"; 
soc.setEnabledCipherSuites(ciphersToBeEnabled); 

あなたはアイデアを得ることを願っています。何か問題がある場合は、下記にコメントしてください。これを行うだけでは、RC4関連の暗号は有効になりません。 jre/lib/security/fileのjava "java.security"ファイルを変更し、無効化されたアルゴリズムリストからCR4を削除する必要があります。

0

HttpClientを取得するには、HttpClientBuilderを使用することをお勧めします。このビルダーでは、を設定し、次にRegistry<ConnectionSocketFactory>とすることができます。このConnectionSocketFactoryでは、クライアントが制限したい暗号とプロトコルを設定できます。

サンプルコード:

Registry<ConnectionSocketFactory> socketFactoryRegistry; 
    { 
     SSLContext sslcontext = <your SSLContext>; 
     socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() 
      .register("http", new PlainConnectionSocketFactory()) 
      .register("https", new SSLConnectionSocketFactory(sslcontext, 
            <your supported protocols, could be null>, 
            <your supported ciphers, could be null>, 
            <your HostnameVerifier> 
      .build(); 
    } 

HttpClientBuilder b = HttpClientBuilder.create() 
    .setConnectionManager(new BasicHttpClientConnectionManager(socketFactoryRegistry)) 
    .set<anything else you want>(<with what you want>); 

HttpClient client = b.build(); 
関連する問題