2015-10-15 57 views
0

最近我们构建了新的Windows 2012服务器,其中包含tomcat 7.0.57和java版本“1.8.0_45”。“SSL23_GET_SERVER_HELLO:未知协议”服务器升级后

从客户端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

回答

1

无论是Java 1.8和Tomcat 7.0.57 and later禁用SSLv3默认的Java 1.8默认为禁用SSLv2Hello和OpenSSL,使用SSLv2HelloSSLv3,因此协议不匹配,双方无法正确完成SSL/TLS握手。

如果要从OpenSSL s_client进行连接,请使用-tls1开关(或-tls1_1等),并且您应该能够进行连接。

如果你想重新启用在Tomcat中SSLv3,阅读Configuration section of the Tomcat Users' Guide,特别是关于sslEnabledProtocolssslProtocol属性。

编辑2015年10月19日16时40分美国/纽约

上述适用于基于Java的连接器,它使用JVM的内置JSSE的密码。如果您使用本地的基于APR的连接器,则将使用OpenSSL。 OpenSSL的默认行为将取决于您所安装的版本......随着越来越多的新版本已经发布,默认的协议进行了修订。

只要基础库(JSSE或OpenSSL)支持该协议,就可以始终使用Tomcat的配置启用任何协议。如果你选择一个支持的协议

OpenSSL的将使用精确的协议特定的握手(如TLSv1 - >的TLSv1握手,TLSv1.1 - > TLSv1.1握手,等等),但将使用SSLv2hello,如果你有一个以上的协议启用(例如SSLProtocol="TLSv1+TLSv1.1")。这在Tomcat's HTTP connectorSSLProtocol属性下记录。

如果你不确定,是非常具体与您启用的协议(无论连接器类型),并始终以一个有信誉的测试套件进行测试,以确定哪些协议正在正确支持。

+0

默认假设JSSE(不是 “本地”= APR)的Java 8或7 JSSE *客户端上禁用SSLv2Hello *但不*服务器*;根据你的链接,Tomcat显然会禁用它。 OpenSSL *命令行*'s_client'默认为v2格式通过0.9.8,v3从1.0.0开始; OP的错误信息中的源信息表明他正在从2009年起运行0.9.8 patch j到l。 0.9.8和1.0.0没有实现TLS1.1或1.2,因此没有'-tls1_1'标记,也没有' - - tls1_2'也不是'-no_'版本。 ... –

+0

...默认情况下所有版本*甚至在v2格式(1.0.1和更高版本1.2)中都提供*至少1.0,但具有SSLv2Hello off的JSSE 8拒绝任何v2优惠, 使用警报40与版本1.2因此v3格式)0.9.8客户认为无效。有趣的是,JSSE ** 7 **警告1.0版本,OpenSSL可以理解,但即使如此,40 = handshake_failure也不是非常有用。 (OpenSSL * library *根本不默认,取决于应用程序。)那些说,我同意的结论。 –

+0

openssl命令使用-tls(s_client -connect xxx.xxx.xxx.xxx:443 -tls)。但是当我试图通过设置sslProtocol =“SSLv3”在tomcat服务器本身中启用SSlv3时,openssl命令不工作(不带-tls)。根据我的理解。如果我们在服务器中启用SSLv3,openssl应该在没有-tls的情况下工作。 –