3

有一个项目广泛使用 JSSE。

根据配置参数,SSLContext 被初始化为SSLv3. 意思是如果参数没有设置它是SSLv3,否则它是TLS

我偶尔注意到一些握手失败并跟踪它:如果客户端协商 TLS 并且服务器回复为SSLv3,则握手失败

为什么会这样?我认为 TLS 和 SSLv3 几乎可以互换。他们不是吗?如果我将服务器端更改为始终回复TLS,是否有可能会破坏某些内容?

4

2 回答 2

3

TLS 1.0 在内部是 SSL 3.1。客户端和服务器可以接受使用其中一个或两个;在握手期间,客户端发送它知道的最高协议版本,服务器应该选择它支持的最高版本,但并不总是比客户端发送的版本更新。

我的猜测是,当您将客户端配置为使用 TLS 时,客户端会将其理解为“使用TLS 1.0”:客户端发送“3.1”,如果服务器配置为使用“3.0”响应,那么客户端将非常合乎逻辑地拒绝连接。

您应该做的是找到一种方法将服务器配置为同时接受 3.03.1,从而使用客户端宣布的任何协议版本。或者,将客户端配置为声明它知道 3.1,但如果服务器这么说,它也接受“降级”到 3.0。

于 2011-03-28T11:57:27.597 回答
1

您不会通过改变协议参数来说明您想要实现的目标。SSLv3 和 TLS1.0 是非常相似但又不同的协议。SSLv3 中引入的协议协商机制也用于后续协议。最重要的是,SSLContext.getInstance("proto");您应该设置proto为您愿意支持的 SSL 协议的最早版本。之后,对等方将协商使用他们都支持的最新版本的协议。

于 2011-03-26T15:06:14.340 回答