0

由于我需要使用一些旧版服务器,并且由于RC4已从Java 8中删除,所以我需要重新启用一些基于RC4的密码。如发行说明中所述,我们必须使用SSLSocket/SSLEngine.setEnabledCipherSuites()。由于我使用的是Apache HTTP客户端,因此我无法找到一种方法来执行此操作。提前致谢! (我也发现相当半拖车的问题,因此想到发布一个新的答案)如何在使用Apache HTTP Client时设置EnabledCipherSuites?

回答

1

我正面临同样的问题,我能够弄清楚这一点。

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

在“SecureProtocolSocketFactoryImpl”类,你必须要覆盖的方法是公共套接字的createSocket()为SecureProtocolSocketFactory类。

在这种方法中,你会得到一个插座这样

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。在此构建器中,您可以设置HttpClientConnectionManager,而这又可以采取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(); 
相关问题