我有一个用JBoss编写的Java编写的REST API。最近我们将JVM从1.6更新到1.7。这开始只引起我们连接的Python客户端的问题。间歇性地,Python客户端正在获得握手失败。我们写了一个非常简单的测试来重现问题:
import httplib2
for i in range(1,500):
print i
response, content = httplib2.Http(disable_ssl_certificate_validation=True).request('https://server.com:8443',)
提供以下输出:
.
.
.
64
65
66
67
Traceback (most recent call last):
File "api_test/test.py", line 6, in <module>
response, content = httplib2.Http(disable_ssl_certificate_validation=True).request('https://server.com:8443/rest/solidtumor/2012/id/50d3216c092c8554b8b9f384?glossary=true&api_key=APIKEY',)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1445, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1197, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1133, in _conn_request
conn.connect()
File "/home/hostovic/api_test/httplib2/__init__.py", line 914, in connect
raise SSLHandshakeError(e)
httplib2.SSLHandshakeError: [Errno 1] _ssl.c:490: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
第67次调用在此次运行中失败,但每次运行测试时都会在不同时间失败。
我们的其他客户端(Java,Groovy和Ruby)没有任何问题。
如果我将JVM切换回1.6,则故障停止。
我使用以下方法进行了openssl检查:
openssl s_client -connect server.com:8443
它返回了这个:
New, TLSv1/SSLv3, Cipher is EDH-RSA-DES-CBC3-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : EDH-RSA-DES-CBC3-SHA
Session-ID: 50E748EA341BB433EEBC7386C606313C2B8B86360ED71DC8F3B0A14A1579D91B
Session-ID-ctx:
Master-Key: 1007AC489D60FE2D818F71A5A6873D5BBF5B1770BEC31CDBF29D0562DB0D30A33D9EBBA8AD211B8E24B23494B20A6223
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1357334762
Timeout : 300 (sec)
Verify return code: 0 (ok)
这似乎是正确的,但我不确定。如果它在每次通话中失败都会是一回事,但只是随机失败才真是奇怪。有谁见过这个?
答案 0 :(得分:5)
使用Python 2.6连接到Tomcat 7(Java 1.7)时,我遇到了同样的间歇性错误。
当我将JVM从1.7u1升级到1.7u6时,我首先遇到了这个问题。在本文中,看起来密码首选项顺序在Java中已更改:
Java 7 and Could not generate DH keypair
在JVM升级之前,SSL_RSA_WITH_3DES_EDE_CBC_SHA是用于SSL通信的首选密码。升级后,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA会获得首选项。 95%的时间,SSL通信都很好。但是有5%的时间,它就像你所描述的那样失败了。
似乎Python在Diffie-Hellman密码方面存在问题。 Python 3.3中有一个修复:
http://bugs.python.org/issue13626
我目前的解决方法是从Tomcat中启用的密码中删除Diffie-Hellman密码。我还没有尝试升级到Python 3.3。
答案 1 :(得分:0)
从Java 6升级到Java 7后,我遇到了同样的问题。
我调试了一下,结果发现它是Java 7实施DHE密码套件的一个错误:DHE密码套件的大约0.5%的SSL握手失败。 (它与Python无关,并且可以使用例如“openssl”命令行工具重现该错误。)
我已向Oracle报告了该错误,有关详细信息,请参阅http://mail.openjdk.java.net/pipermail/security-dev/2013-May/007435.html。同时,唯一的解决方法是禁用DHE密码套件(两端)。