【问题标题】:Log displays TLSv1 instead of SSLv3日志显示 TLSv1 而不是 SSLv3
【发布时间】:2018-10-21 14:57:15
【问题描述】:

我已使用-Djavax.net.debug=all 选项在我的应用程序中启用日志。编写的代码应该使用 SSLv3 协议,但是在我检查时在日志中显示为 ::

*** ClientHello, TLSv1

*** ServerHello, TLSv1

据我了解,客户端和服务器使用 TLSv1 进行握手,但由于我在启动套接字时在代码中使用了 SSLv3,因此理想情况下它应该打印 SSLv3 而不是 TLSv1。

下面是我用过的sn-p代码:

SSLContextBuilder builder = new SSLContextBuilder();
builder.useProtocol("SSLv3");

SSLContext sslContext = builder.build();

有人可以澄清同样的原因,还是我错过了其他东西。只是补充一下,我使用的是 Java 7。

【问题讨论】:

  • 为什么?只需让 Java 选择支持的最高版本即可。没有理由使用故意过时的协议。
  • @EJP 如果 Java 选择支持的最高版本,那么它不应该打印 1.2 而不是 1,因为 java7 支持 TLSv1.2 吗?我的意思是我不太确定,但如果我必须在某处使用 SSLv3 并且它也受 java 支持,那么为什么在日志中打印 TLSv1。我的问题是,不应该抛出错误信息吗?
  • 握手期间message-related日志条目中的版本可能是错误的;见stackoverflow.com/questions/49748108/…READ:WRITE: 应该显示正确的记录版本,或者查看以十六进制转储的实际消息。注意 ClientHello 中的记录版本不控制使用的协议;这取决于 ClientHello 的 body 和 ServerHello 的 body 中的版本。 (对于 1.3,它也将取决于 extensions。但 j7 不做 1.3。)

标签: java tls1.2 sslv3 sslcontext ssl-security


【解决方案1】:

很可能SSLv3 只是服务器不支持(由于安全原因,现在推荐配置),因此该库使用最少支持的TLS 版本。

UPD:似乎 hello 格式并没有说明实际上将使用什么协议。有东西来自Java docs

目前,SSLv3、TLSv1 和 TLSv1.1 协议允许您发送封装在 SSLv2 格式 hello 中的 SSLv3、TLSv1 和 TLSv1.1 hello。有关在这些协议中允许这种兼容性的原因的更多详细信息,请参阅相应 RFC(之前列出)中的附录 E。

请注意,某些 SSL/TLS 服务器不支持 v2 hello 格式,并要求客户端 hello 符合 SSLv3 或 TLSv1 客户端 hello 格式。

SSLv2Hello 选项控制 SSLv2 封装。如果客户端禁用 SSLv2Hello,则所有传出消息都将符合 SSLv3/TLSv1 客户端问候格式。如果服务器上禁用了 SSLv2Hello,那么所有传入的消息都必须符合 SSLv3/TLSv1 客户端 hello 格式。

【讨论】:

  • 如果任何一方都不支持 SSLv3,那么应该没有握手,并且应该导致一些错误消息,对吧?如果我理解正确的话。
  • 我已经检查了方法和文档的实现,这里似乎没有什么简单的,请检查更新的答案
  • 感谢@Anton Malyshev
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 2014-12-26
  • 2017-05-14
  • 2020-09-24
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多