最近我们构建了新的Windows 2012服务器,其中包含tomcat 7.0.57和java版本“1.8.0_45”。
从客户端openssl连接时,我收到以下错误。但是从IE完美运作。
新服务器:
OpenSSL> s_client -connect xxx.xxx.xxx.xxx:443
Loading 'screen' into random state - done
CONNECTED(00000130)
5724:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:.\ssl\s
23_clnt.c:601:
OpenSSL>
旧服务器:(正常连接)
OpenSSL> s_client -connect yyy.yyy.yyy.yyy:443
Loading 'screen' into random state - done
CONNECTED(00000114)
depth=1 /C=XX/O=YYYY CA1
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
.........
SSL handshake has read 3064 bytes and written 282 bytes
---
New, TLSv1/SSLv3, Cipher is EDH-RSA-DES-CBC3-SHA
Server public key is 2048 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : EDH-RSA-DES-CBC3-SHA
.......
任何人都能说出为什么会这样吗?
新服务器: Windows 2012 R2 / java版“1.8.0_45”/ Tomcat 7.0.57
旧服务器: Windows 2003 / java版“1.6.0_31”/ Tomcat 6.0
客户端: Windows 7 / Java 1.7.0_75
答案 0 :(得分:1)
默认情况下,Java 1.8和Tomcat 7.0.57 and later都禁用SSLv3
,默认情况下禁用Java 1.8 SSLv2Hello
,默认情况下,OpenSSL使用SSLv2Hello
和SSLv3
,因此协议不匹配,双方无法正确完成SSL / TLS握手。
如果您想从OpenSSL s_client
进行连接,请使用-tls1
开关(或-tls1_1
等),您应该能够连接。
如果您想在Tomcat中重新启用SSLv3
,请阅读Configuration section of the Tomcat Users' Guide,特别是sslEnabledProtocols
和sslProtocol
属性。
编辑2015-10-19 16:40 America / New_York
以上内容适用于基于Java的连接器,它使用JVM的内置JSSE进行加密。如果使用本机APR-base连接器,将使用OpenSSL。 OpenSSL的默认行为取决于您安装的版本...随着更新版本的发布,默认协议已经修改。
只要底层库(JSSE或OpenSSL)支持该协议,您就可以始终使用Tomcat的配置来启用任何协议。
如果您选择一个支持的协议(例如TLSv1
- > TLSv1握手,TLSv1.1
- > TLSv1.1握手等),OpenSSL将使用确切的协议特定握手。如果您启用了多个协议(例如SSLv2hello
),请使用SSLProtocol="TLSv1+TLSv1.1"
。这记录在Tomcat's HTTP connector的SSLProtocol
属性下。
如果您不确定,请使用已启用的协议(无论连接器类型如何),并始终使用信誉良好的测试套件进行测试,以确定哪些协议得到了正确支持。