2013-01-05 7 views
7

JBossで動作するJavaで書かれたREST APIがあります。最近、JVMを1.6から1.7に更新しました。これは接続していた私たちのPythonクライアントだけで問題を引き起こし始めました。断続的に、Pythonクライアントがハンドシェイクの失敗を起こしています。テストがあるたびにしてこの実行に失敗したが、それは異なる時間に失敗しPythonで断続的な "sslv3 alert handshake failure"が発生しました

. 
. 
. 
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回電話を:

import httplib2 

for i in range(1,500): 
    print i 
    response, content = httplib2.Http(disable_ssl_certificate_validation=True).request('https://server.com:8443',) 

は、次の出力を与える:私たちは、問題を再現する非常に簡単なテストを書きました走る

他のクライアント(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) 

を、私はよく分かりません。それがすべての呼び出しで失敗した場合、それは1つのことですが、ランダムな時間に失敗するのは本当に奇妙です。誰もこれを見た?

答えて

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暗号に問題があるようです。それはTomcatの中に私の有効な暗号からのDiffie-Hellman暗号を削除する

http://bugs.python.org/issue13626

私の現在の回避策:Pythonの3.3での修正があります。私は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 7

へのJava 6からのアップグレード後に同じ問題を抱えている私は、このビットデバッグ、およびそれがDHE暗号スイートのJavaの7の実装のバグですが判明:SSLの約0.5% DHE暗号スイートのハンドシェイクは失敗します。 (これはPythonとは関係がなく、例えば "openssl"コマンドラインツールなどで再現することもできます)

バグをOracleに報告しました。詳しくは、http://mail.openjdk.java.net/pipermail/security-dev/2013-May/007435.htmlを参照してください。一方、唯一の回避策は、DHE暗号スイートを無効にすることです(両端で)。

関連する問題