2013-01-05 116 views
7

我有一個在JBoss下運行的Java編寫的REST API。最近我們將JVM從1.6更新爲1.7。這開始導致只有我們連接的Python客戶端出現問題。間歇地,Python客戶端正在握手失敗。我們寫了一個非常簡單的測試,重新產生此問題:Python下的間歇性「sslv3警報握手失敗」

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) 

這似乎是正確的,但我不知道。如果它在每次通話中失敗,那將是一回事,但僅僅失去隨機時間真的很奇怪。任何人看到這個?

回答

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

您是否刪除了所有DHE密碼或只是您列出的密碼?由於安全掃描投訴支持弱密碼,我已經縮減了我的密碼列表。這是我目前使用的名單: SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA –

+0

我只是刪除了DHE密碼和握手錯誤都沒有了。萬分感謝。不知道我會找到那個! –

0

我從Java 6升級到Java 7

後有同樣的問題我調試這一點,原來這是在Java 7中的實現DHE密碼套件的錯誤:SSL的約0.5% DHE密碼套件握手失敗。 (這與Python無關,並且該bug也可以通過例如「openssl」命令行工具進行復制。)

我向Oracle報告了該錯誤,請參閱http://mail.openjdk.java.net/pipermail/security-dev/2013-May/007435.html以瞭解詳細信息。同時,唯一的解決方法是禁用DHE密碼套件(兩端)。