【问题标题】:How to setEnabledCipherSuites when using Apache HTTP Client?使用 Apache HTTP 客户端时如何设置启用密码套件?
【发布时间】:2016-04-20 03:23:31
【问题描述】:
由于我需要使用一些旧版服务器,并且由于 RC4 已从 Java 8 中删除,因此我需要重新启用一些基于 RC4 的密码。如发行说明中所述,我们必须使用SSLSocket/SSLEngine.setEnabledCipherSuites()。由于我使用的是 Apache HTTP 客户端,我无法找到执行此操作的方法。提前致谢! (我还发现了一个没有答案的半拖车问题,所以想发布一个新的)
【问题讨论】:
标签:
java
httpclient
apache-httpclient-4.x
apache-commons-httpclient
【解决方案1】:
我遇到了同样的问题,我能够解决这个问题。
SecureProtocolSocketFactoryImpl protFactory = new SecureProtocolSocketFactoryImpl();
httpsClient.getHostConfiguration().setHost(host, port, httpsProtocol);
在“SecureProtocolSocketFactoryImpl”类中,您必须为 SecureProtocolSocketFactory 类重写方法 public Socket createSocket()。
在那个方法中你会得到一个这样的套接字
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/ 文件中的 java "java.security" 文件,并从禁用算法列表中删除 CR4。
【解决方案2】:
获取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();