有一个项目广泛使用JSSE。
根据配置参数,为SSLv3
初始化SSLContext。这意味着如果未设置参数,则为SSLv3
,否则为TLS
。
我偶尔注意到一些握手失败并追踪它:如果客户端协商了TLS并且服务器回复了SSLv3
,则握手失败
为什么会这样?我认为TLS和SSLv3几乎可以互换。
他们不是吗?如果我将服务器端更改为始终回复TLS
,我是否有可能破坏某些内容?
答案 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协议。之后,对等方将协商使用他们都支持的最新版协议。