java - HTTP 客户端 SSL 连接 setEnabledCipherSuites

标签 java ssl httpurlconnection

我有一个通过 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/

相关文章:

java - 文本字段不会填充

asp.net - 无法创建 SSL/TLS 安全通道 - GetRequestStream()

email - 无法让 Zabbix 发送电子邮件警报

android - ResponseCode 是 301 用于 url 连接而不是 200 在 android

java - 这是使用 Singleton 的好理由吗?

java - Eclipse MAT 不显示浅/保留的堆大小

tomcat - 无法使用 key 、证书和 CA 证书链长度 : 1 为 Tomcat 创建 keystore

java - android中的Http GET请求错误

java - 在写入内容之前调用 HttpUrlConnection 上的 getResponseCode 会引发 IOException

java - 如何在 Tomcat 中添加本地库?