HTTP客户端SSL连接setEnabledCipherSuites

时间:2015-08-27 22:47:37

标签: java ssl httpurlconnection

我有一个通过HTTPS连接到服务器的应用程序。 有问题的服务器有一个弱证书,它使用RC4 Cipher(最近从JDK https://www.java.com/en/download/faq/release_changes.xml删除了默认支持) 因此,在升级JDK之后,我看到javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

发行说明指定您应该使用SSLSocket / SSLEngine.setEnabledCipherSuites() 专门启用某些密码。

但是,使用HttpsUrlConnection或Apache的CloseableHttpClient,我只能找到如何指定SslSocketFactory。这似乎没有提供函数.setEnabledCipherSuites。

发现这篇文章:Why does SSLSocketFactory lack setEnabledCipherSuites?

我的问题是: 有没有办法在出站客户端HTTP请求上获取SSLEngine / Socket,以便我可以在握手之前设置密码套件?

提前致谢。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我能够解决这个问题。

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

在" SecureProtocolSocketFactoryImpl" class必须覆盖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相关的密码。您将需要修改java" java.security"在jre / lib / security / file中的文件,并从禁用的算法列表中删除CR4。

答案 1 :(得分:0)

对于HttpsURLConnection,请设置系统属性https.cipherSuites