2015-10-15 101 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的情況下工作。 –