【发布时间】:2021-04-07 11:18:35
【问题描述】:
jdk1.7.0_79 和 okhttp 3.8 调用 https url 失败
main, WRITE: TLSv1 Handshake, length = 148
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, called close()
main, called closeInternal(true)
写和读都TLSv1为什么还是handshake_failure,如果用jdk8也没关系,握手信息如下
main, WRITE: TLSv1.2 Handshake, length = 170
main, READ: TLSv1.2 Handshake, length = 93
main, READ: TLSv1.2 Handshake, length = 5516
客户端和服务器都使用 TLSv1.2
所以尝试将 jdk7 默认 tls 更改为 TLSv1.2 在此 doc 中遵循以下方法
// Enable TLS 1.0, 1.1 and 1.2 in an SSLSocket object.
sslSocket.setEnabledProtocols(new String[] {"TLSv1", "TLSv1.1", "TLSv1.2"});
但这次还是handshake_failure,调试信息是
main, WRITE: TLSv1.2 Handshake, length = 178
main, READ: TLSv1.2 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, called close()
main, called closeInternal(true)
这次 write 使用 TLSv1.2 但 recv 仍然使用 TLSv1。 为什么会这样?如何让客户端和服务器都使用TLSV1.2?
【问题讨论】:
-
实际上它并没有“使用 TLSv1”。 WRITE 和 READ 日志条目使用记录中的版本在记录级别完成,但 recvAlert(和 sendAlert)记录存储在
SSLSocketImpl类中的“已同意”版本,该版本尚未设置。查看实际消息——无论是在 javax.net.debug 输出中还是在外部使用 wireshark 或类似的——你会看到 ClientHello 提供 TLSv1.2 和警报 is TLSv1.2。见stackoverflow.com/questions/49748108/…
标签: https java-7 okhttp tls1.2