簡體   English   中英

Python下的間歇性“sslv3警報握手失敗”

[英]Intermittent “sslv3 alert handshake failure” under Python

我有一個用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)

這似乎是正確的,但我不確定。 如果它在每次通話中失敗都會是一回事,但只是隨機失敗才真是奇怪。 誰見過這個?

使用Python 2.6連接到Tomcat 7(Java 1.7)時,我遇到了同樣的間歇性錯誤。

當我將JVM從1.7u1升級到1.7u6時,我首先遇到了這個問題。 從本文開始,看起來Java中的密碼首選項順序已更改:

Java 7並且無法生成DH密鑰對

在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。

從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密碼套件(兩端)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM