您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何在Java中设置SSL协议版本?我怎么知道哪一个呢?javax.net.ssl.SSLException:收到致命警报:protocol_version

如何在Java中设置SSL协议版本?我怎么知道哪一个呢?javax.net.ssl.SSLException:收到致命警报:protocol_version

我从调试中看到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

在这里,您可以看到主机支持SSLv23和TLSv1握手,但不支持使用的TLSv1_2握手。

java 2022/1/1 18:30:58 有505人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶