我有一个通过 HTTPS 连接到服务器的应用程序。 有问题的服务器有一个使用 RC4 密码的弱证书(最近从 JDK 中删除了默认支持 https://www.java.com/en/download/faq/release_changes.xml ) 所以在升级 JDK 之后,我看到了 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
发行说明指定您应该使用 SSLSocket/SSLEngine.setEnabledCipherSuites() 专门启用某些密码。
但是,使用 HttpsUrlConnection 或 Apache 的 CloseableHttpClient,我只能找到如何指定 SslSocketFactory。似乎没有提供函数 .setEnabledCipherSuites。
找到这个帖子:Why does SSLSocketFactory lack setEnabledCipherSuites?
我的问题是: 有没有办法在出站客户端 HTTP 请求上获取 SSLEngine/Socket,以便我可以在握手之前设置密码套件?
提前致谢。
最佳答案
我遇到了同样的问题,我能够解决这个问题。
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。
关于java - HTTP 客户端 SSL 连接 setEnabledCipherSuites,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32260628/