有一个项目广泛使用 JSSE。
根据配置参数,SSLContext 被初始化为SSLv3
. 意思是如果参数没有设置它是SSLv3
,否则它是TLS
。
我偶尔注意到一些握手失败并跟踪它:如果客户端协商 TLS 并且服务器回复为SSLv3
,则握手失败
为什么会这样?我认为 TLS 和 SSLv3 几乎可以互换。他们不是吗?如果我将服务器端更改为始终回复TLS
,是否有可能会破坏某些内容?
有一个项目广泛使用 JSSE。
根据配置参数,SSLContext 被初始化为SSLv3
. 意思是如果参数没有设置它是SSLv3
,否则它是TLS
。
我偶尔注意到一些握手失败并跟踪它:如果客户端协商 TLS 并且服务器回复为SSLv3
,则握手失败
为什么会这样?我认为 TLS 和 SSLv3 几乎可以互换。他们不是吗?如果我将服务器端更改为始终回复TLS
,是否有可能会破坏某些内容?
TLS 1.0 在内部是 SSL 3.1。客户端和服务器可以接受使用其中一个或两个;在握手期间,客户端发送它知道的最高协议版本,服务器应该选择它支持的最高版本,但并不总是比客户端发送的版本更新。
我的猜测是,当您将客户端配置为使用 TLS 时,客户端会将其理解为“仅使用TLS 1.0”:客户端发送“3.1”,如果服务器配置为使用“3.0”响应,那么客户端将非常合乎逻辑地拒绝连接。
您应该做的是找到一种方法将服务器配置为同时接受 3.0和3.1,从而使用客户端宣布的任何协议版本。或者,将客户端配置为声明它知道 3.1,但如果服务器这么说,它也接受“降级”到 3.0。
您不会通过改变协议参数来说明您想要实现的目标。SSLv3 和 TLS1.0 是非常相似但又不同的协议。SSLv3 中引入的协议协商机制也用于后续协议。最重要的是,SSLContext.getInstance("proto");
您应该设置proto
为您愿意支持的 SSL 协议的最早版本。之后,对等方将协商使用他们都支持的最新版本的协议。