JAVA TLS 1.2有时会降级为TLS 1.0

时间:2015-07-23 06:22:30

标签: java iis ssl nginx

我在JAVA中编写了TLS客户端。当我设置

sslContext = TLS1.2
and enabled protocols to SSLv3 TLSv1 TLSv1.1 TLS1.2

它几乎适用于所有服务器。客户端与TLSv1.2开始握手。如果服务器只能使用TLSv1,则在握手期间连接会降级为TLSv1。 但!我们使用了大约15个这样的TLSv1服务,其中4个未能降级。服务器都不同:

Microsoft-IIS / 7.5,nginx,IBM_HTTP_SERVER,SQLAnywhere。

这样的错误:

SEND TLSv1 ALERT:  fatal, description = unexpected_message  X2
handling exception: javax.net.ssl.SSLException: Invalid Padding length: 139
javaException : Received fatal alert: unexpected_message

如果我将启用的协议设置为TLSv1,那么这些服务器工作正常。但我希望设置sslContext和启用的协议与所有服务兼容,并且最好使用TLSv1.2

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

但是我希望set sslContext和启用的协议与所有服务兼容,并且最好使用TLSv1.2

首先,有足够的服务器没有做TLS 1.2,但他们能做的最好的是TLS 1.0(有些甚至只有SSL 3.0)。在这种情况下,TLS堆栈的正确实现只是发送TLS 1.0回复,从而强制连接为客户端支持的TLS 1.0。强制这些服务器到TLS 1.2将无法正常工作,因为它们没有实现它。您所能做的就是用更新的实现替换服务器。

然后有几个实现错误地实现了协议。如果您发送TLS 1.2 ClientHello或使用他们从未听说过的一些TLS扩展,其中一些只是关闭连接。如果你不能替换这些服务器,你必须以他们理解的方式与他们通信,比如只说TLS 1.0等。浏览器已经通过慢慢降级连接来处理这个烂服务器,即如果TLS 1.2导致握手失败,他们将再试一次使用TLS 1.0等。通常浏览器甚至硬编码了一个服务器列表,这些服务器在尝试简单的降级后需要有特殊的密码或者类似的东西,它们太烂了甚至不能玩得很好。