【发布时间】:2016-06-17 16:05:53
【问题描述】:
问题
所以,我需要使用旧的、已弃用的证书连接到该服务器。如果我尝试使用Apache HttpClient 连接到它,我会得到SSLException: Received fatal alert: close_notify。客户端本身不需要可被其他服务器重用,但构建器代码必须能够。
我不太理想的解决方法
我通过设置回退 TLS 协议解决了这个问题,但这并不理想,因为它添加了另一个请求。一定有比这更优雅的方式:
URL url = new URL("https://...");
SSLContextBuilder sslContextBuilder = SSLContexts.custom();
try {
url.openConnection().connect();
} catch (SSLException e) {
sslContextBuilder.useProtocol("TLSv1");
}
我也试过了
我也尝试过创建自定义SSLConnectionSocketFactory,但如果包含TLSv1.2 作为选项,apache 会忽略TLSv1。
SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(
SSLContext.getDefault(),
new String[] { "TLSv1.2", "TLSv1" },
null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
反思
本质上,我认为基本问题是远程服务器使用了已弃用的密码套件。我可以将我想要支持的所有密码套件传递到 SSLConnectionSocketFactory,但是有很多,而且 Sun 已经隐藏了私有课程后面的完整列表。
【问题讨论】:
-
你能列出那个服务器吗?例如ex.qq.com 。您可以在 ssllabs.com 上试用,看看它支持哪些 SSL 版本和密码套件。
-
下定决心。它是已弃用的证书还是已弃用的密码套件?
标签: java ssl apache-httpclient-4.x tls1.2