我从调试中看到Java进行TLS1.2握手,而不是更常见的SSLv23握手:
main, WRITE: TLSv1.2 Handshake, length = 225
[Raw write]: length = 230
0000: 16 03 03 00
^^^^^ - TLS1.2 (SSL3.3)
服务器本身只能执行TLS1.0,并且无法仅宣布此旧版本。我对Java不熟悉,但是您需要将协议版本设置为TLSv1或SSLv23才能与该服务器通信。
以下代码将仅使用Apache HttpClient设置TLSv1:
HttpClientBuilder
.create()
.setSslcontext(SSLContexts.custom().useProtocol("TLSv1").build())
.build()
.execute(new HttpGet("https://hubic.com"));
如果您说服务器“无法仅发布此旧版本”,是否表示服务器配置错误?在这种情况下,为什么Firefox&Chromium没有任何问题?
如果客户端在ClientHello中宣告TLS1.2,而服务器只能执行TLS1.0,则它应宣告,即以TLS1.0答复。如果TLS1.0不够好,则客户端可以关闭连接,或者继续使用TLS1.0。但是,在这种情况下,服务器只是告诉客户端它不喜欢此版本,并关闭了连接。Firefox和其他公司则发布SSLv23声明,在此过程中进行TLS1.0握手,同时还声明其支持的最佳协议版本。这通常适用于从SSL3.0开始的旧服务器,也适用于新服务器。
您可以使用最新的Perl / IO :: Socket :: SSL和此脚本检查服务器的行为。
$ perl analyze-ssl.pl hubic.com
-- hubic.com port 443
* maximum SSL version : TLSv1 (SSLv23)
* supported SSL versions with handshake used and preferred cipher(s):
* handshake protocols ciphers
* SSLv23 TLSv1 AES256-SHA
* TLSv1_2 Failed: SSL connect attempt Failed error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
* TLSv1_1 Failed: SSL connect attempt Failed error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
* TLSv1 TLSv1 AES256-SHA
* SSLv3 Failed: SSL connect attempt Failed because of handshake problems error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version