JAVA TLS 1.2 降级到 TLS 1.0 有时会出错
JAVA TLS 1.2 downgrade to TLS 1.0 sometimes error
我在 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
如有任何建议,我们将不胜感激!
But i want set sslContext and enabled protocols to be compatible with all services and preferably work with 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 等再试一次。通常浏览器甚至硬编码了一个服务器列表,这些服务器在尝试简单降级后甚至无法正常运行并且需要特殊密码或类似的东西。
我在 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
如有任何建议,我们将不胜感激!
But i want set sslContext and enabled protocols to be compatible with all services and preferably work with 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 等再试一次。通常浏览器甚至硬编码了一个服务器列表,这些服务器在尝试简单降级后甚至无法正常运行并且需要特殊密码或类似的东西。