2013-01-05 31 views
7

Tôi có một API REST được viết bằng Java đang chạy dưới JBoss. Gần đây, chúng tôi đã cập nhật JVM của mình từ 1,6 lên 1,7. Điều này bắt đầu gây ra vấn đề chỉ với các khách hàng Python của chúng tôi đang kết nối. Không liên tục, các máy khách Python đang bị lỗi bắt tay. Chúng tôi đã viết một bài kiểm tra rất đơn giản mà tái tạo các vấn đề:Không liên tục "sslv3 alert handshake failure" dưới 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',) 

Đưa đầu ra sau đây:

. 
. 
. 
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 

Cuộc gọi thứ 67 thất bại trên hoạt động này thông qua, nhưng nó không thành công tại những thời điểm khác nhau mỗi lần kiểm tra là chạy.

Các ứng dụng khách khác của chúng tôi (Java, Groovy và Ruby) không có vấn đề gì.

Nếu tôi chuyển JVM trở lại 1.6 lỗi dừng.

tôi đã làm một kiểm tra openssl sử dụng:

openssl s_client -connect server.com:8443 

và nó trở lại này:

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) 

Mà dường như chính xác, nhưng tôi không chắc chắn. Nếu nó thất bại trong mọi cuộc gọi thì đó sẽ là một chuyện, nhưng thật kỳ quặc khi chỉ thất bại một lần ngẫu nhiên. Bất cứ ai nhìn thấy điều này?

Trả lời

5

Tôi gặp phải lỗi tương tự liên tục khi kết nối với Tomcat 7 (Java 1.7) bằng Python 2.6.

Lần đầu tiên tôi bắt đầu gặp sự cố khi tôi nâng cấp JVM của mình từ 1,7u1 lên 1,7u6. Từ bài viết này, nó trông giống như thứ tự ưu tiên mật mã đã thay đổi trong Java:

Java 7 and Could not generate DH keypair

Trước khi nâng cấp JVM, SSL_RSA_WITH_3DES_EDE_CBC_SHA là mật mã ưa thích được sử dụng để giao tiếp SSL. Sau khi nâng cấp, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA được ưu tiên. 95% thời gian, giao tiếp SSL là tốt. Nhưng 5% thời gian, nó không thành công như bạn đã mô tả.

Dường như Python có vấn đề với mật mã Diffie-Hellman. Có một sửa chữa bằng Python 3.3:

http://bugs.python.org/issue13626

workaround hiện tại của tôi nó để loại bỏ các mật mã Diffie-Hellman từ mật mã kích hoạt của tôi trong Tomcat. Tôi chưa thử nâng cấp lên Python 3.3.

+1

Bạn đã xóa tất cả mật mã DHE hay chỉ một mật khẩu mà bạn đã liệt kê? Tôi đã cắt giảm danh sách mật mã của mình do quét bảo mật phàn nàn về việc hỗ trợ mật mã yếu.Dưới đây là danh sách Tôi hiện đang sử dụng: 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

Tôi chỉ loại bỏ các thuật toán mã hóa DHE và các lỗi bắt tay đã mất hết. Cảm ơn một tấn. Không chắc tôi đã tìm thấy điều đó! –

0

Tôi đang gặp vấn đề tương tự sau khi nâng cấp từ Java 6 đến Java 7.

tôi sửa lỗi này một chút, và hóa ra đó là một lỗi trong việc thực hiện Java 7 của DHE bộ mã hoá: khoảng 0,5% số SSL bắt tay cho bộ mã hóa DHE không thành công. (Nó không liên quan đến Python, và lỗi có thể được sao chép với công cụ dòng lệnh "openssl").

Tôi đã báo cáo lỗi cho Oracle, xem http://mail.openjdk.java.net/pipermail/security-dev/2013-May/007435.html để biết chi tiết. Trong khi đó, cách giải quyết duy nhất là tắt bộ mã hóa DHE (ở cả hai đầu).