为什么在TLS 1.0客户端和SSL 3.0服务器之间出现握手失败?

时间:2011-03-26 11:06:10

标签: java security ssl cryptography jsse

有一个项目广泛使用JSSE。

根据配置参数,为SSLv3初始化SSLContext。这意味着如果未设置参数,则为SSLv3,否则为TLS

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

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

2 个答案:

答案 0 :(得分:3)

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

我的猜测是,当您将客户端配置为使用TLS时,客户端将其理解为“仅使用 TLS 1.0”:客户端发送“3.1”,如果服务器配置为以“3.0”响应,然后客户端将在逻辑上拒绝连接。

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

答案 1 :(得分:1)

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