我已经使用-Djavax.net.debug=all
选项在我的应用程序中启用了日志。已经编写的代码应该使用 SSLv3 协议,但在日志中,当我检查它时,它显示为 ::
*** ClientHello, TLSv1
*** ServerHello, TLSv1
据我从阅读中了解到,客户端和服务器使用 TLSv1 进行握手,但由于我在启动套接字时在代码中使用了 SSLv3,理想情况下它应该打印 SSLv3 而不是 TLSv1。
以下是我使用的代码片段:
SSLContextBuilder builder = new SSLContextBuilder();
builder.useProtocol("SSLv3");
SSLContext sslContext = builder.build();
有人可以澄清同样的原因吗,或者我错过了其他东西。补充一点,我在Java 7上。
很可能SSLv3
只是服务器不支持(出于安全性,现在建议进行配置(,因此lib使用最不支持的TLS
版本。
UPD:似乎hello 格式实际上没有说明将使用什么协议。Java 文档中有一些内容:
目前,SSLv3、TLSv1和 TLSv1.1 协议允许您发送封装在 SSLv2 格式 hello 中的 SSLv3、TLSv1 和 TLSv1.1 hellos。有关在这些协议中允许此兼容性的原因的更多详细信息,请参阅相应 RFC(之前列出的(中的附录 E。
请注意,某些 SSL/TLS 服务器不支持 v2 hello 格式,并要求客户端 hellos 符合 SSLv3 或 TLSv1 客户端 hello 格式。
SSLv2Hello 选项控制 SSLv2 封装。如果在客户端上禁用了 SSLv2Hello,则所有传出消息都将符合 SSLv3/TLSv1 客户端 hello 格式。如果在服务器上禁用了 SSLv2Hello,则所有传入消息都必须符合 SSLv3/TLSv1 客户端 hello 格式。