2015-06-10 25 views
17

Tôi đang cố thiết lập kết nối với trackobot.com để nhận một số dữ liệu JSON. Máy chủ chỉ cho phép kết nối thông qua HTTPS/SSL. Đây là mã:Sự cố khi kết nối qua HTTPS/SSL thông qua máy khách Java riêng

java.lang.System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2"); 
URL url = new URL("https://trackobot.com/profile/history.json?username=USER&token=TOCKEN");  
InputStream is = url.openStream(); 
JsonParser parser = Json.createParser(is); 

openSteam ném javax.net.ssl.SSLHandshakeException: Nhận cảnh báo gây tử vong: handshake_failure

Tôi đọc qua nhiều bài viết liên quan đến vấn đề tương tự nhưng không ai trong số những đề nghị giúp đỡ. Chứng chỉ thích hợp nằm trong cửa hàng tin cậy của tôi. Khi tôi cố gắng kết nối với, ví dụ, google.com không có lỗi. Vì vậy, vấn đề có vẻ là trong các đặc điểm bắt tay của máy chủ mà tôi đang cố gắng kết nối.

tôi chạy mã của tôi sử dụng -Djavax.net.debug = ssl trở về này:

keyStore is : 
keyStore type is : jks 
keyStore provider is : 
init keystore 
init keymanager of type SunX509 
trustStore is: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/security/cacerts 
trustStore type is : jks 
trustStore provider is : 
init truststore 

[Here I removed hundreds of „adding as trusted cert“:… lines] 

trigger seeding of SecureRandom 
done seeding SecureRandom 
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 
Allow unsafe renegotiation: false 
Allow legacy hello messages: true 
Is initial handshake: true 
Is secure renegotiation: false 
main, setSoTimeout(0) called 
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1 
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1 
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 for TLSv1 
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1 
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 for TLSv1 
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1 
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 for TLSv1 
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1.1 
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1 
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1 
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1.1 
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1 
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1 
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 for TLSv1.1 
%% No cached client session 
*** ClientHello, TLSv1.2 
RandomCookie: GMT: 1433943269 bytes = { 109, 198, 189, 148, 62, 6, 19, 126, 179, 214, 250, 99, 207, 117, 162, 47, 62, 176, 222, 247, 98, 29, 155, 63, 255, 100, 171, 187 } 
Session ID: {} 
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 
Compression Methods: { 0 } 
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1} 
Extension ec_point_formats, formats: [uncompressed] 
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA 
Extension server_name, server_name: [type=host_name (0), value=trackobot.com] 
*** 
main, WRITE: TLSv1.2 Handshake, length = 229 
main, READ: TLSv1.2 Alert, length = 2 
main, RECV TLSv1.2 ALERT: fatal, handshake_failure 
main, called closeSocket() 
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1991) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1104) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1511) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
    at java.net.URL.openStream(URL.java:1038) 
    at trackbot.readHistory(trackbot.java:37) 
    at hsanalytics.main(hsanalytics.java:6) 
Ende 

Hơn nữa, tôi sử dụng openssl và perl script (analyze-ssl.pl) để kiểm tra máy chủ.

Đối với openssl s_client -connect trackobot.com:443 tôi nhận:

CONNECTED(00000003) 
depth=2 /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 
verify error:num=19:self signed certificate in certificate chain 
verify return:0 
--- 
Certificate chain 
0 s:/C=CH/CN=www.trackobot.com/[email protected]ndi.net 
    i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA 
1 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA 
    i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 
2 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 
    i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
MIIGaTCCBVGgAwIBAgIHBaEI9iSK1jANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UE 
BhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBE 
aWdpdGFsIENlcnRpZm 
[...] 
bnCZTkntRP7wPfw6DpPdJzt8BD0Rpp0B8fVUkqkUujP 
FEgspzHXqvAp3gzDuNVlElZ4pxSC/06x9xlPua4KnnKIPMVK0DjyXKdPgUaw6YH9 
I3SprrGd/B5AoxdPYDM1qRGC+hto3YDnAb29CRFx13mfiEF9En6YrmlZMwJ/dMjo 
RcvkqpjoxTLODmX9gWgdJ27Ublq/4f/Q9nlVfx4v00eYyqyMYY6IMlOUWEBvWoAv 
zorzLLY9PmepXJtkCw== 
-----END CERTIFICATE----- 
subject=/C=CH/CN=www.trackobot.com/[email protected]ndi.net 
issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 5848 bytes and written 328 bytes 
--- 
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : DHE-RSA-AES256-SHA 
    Session-ID: A868799D47C550929ADF026FDC48CABD2444C96FDDAB86036196029BF7754D1B 
    Session-ID-ctx: 
    Master-Key: 6C0E428129970C6B1E358E134B12125373BED6FF50D55004A68A9042AD4E51C6D70BB8480266CC1BD1F11B093E212BFC 
    Key-Arg : None 
    Start Time: 1433943895 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 
--- 

Đối với phân tích-ssl trackobot.com:443 tôi nhận:

-- trackobot.com port 443 
! server sent unused chain certificate '/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority' 
! server sent unused chain certificate '/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority' 
* maximum SSL version : TLSv1_2 (SSLv23) 
* supported SSL versions with handshake used and preferred cipher(s): 
    * handshake protocols ciphers 
    * SSLv23 TLSv1_2 ECDHE-RSA-AES256-GCM-SHA384 
    * TLSv1_2 TLSv1_2 ECDHE-RSA-AES256-GCM-SHA384 
    * TLSv1_1 TLSv1_1 ECDHE-RSA-AES256-SHA 
    * TLSv1  TLSv1  ECDHE-RSA-AES256-SHA 
    * SSLv3  FAILED: SSL connect attempt failed because of handshake problems error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure 
* cipher order by  : server 
* SNI supported  : ok 
* certificate verified : ok 
* chain on 5.102.146.151 
    * [0/0] bits=2048, ocsp_uri=http://ocsp.startssl.com/sub/class1/server/ca, /C=CH/CN=www.trackobot.com/[email protected]ndi.net SAN=DNS:www.trackobot.com,DNS:trackobot.com 
    * [1/1] bits=2048, ocsp_uri=http://ocsp.startssl.com/ca, /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA 
    * [2/-] bits=4096, ocsp_uri=, /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 
    * [-/2] bits=4096, ocsp_uri=, /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 
* OCSP stapling  : no stapled response 
* OCSP status   : good (soft error: no ocsp_uri for /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority) 

phiên bản:

Mac OSX 10.10.3 
OpenSSL 0.9.8zd 8 Jan 2015 
java version "1.8.0_25" 
Java(TM) SE Runtime Environment (build 1.8.0_25-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) 

Có ai có thể phát hiện chương trình Java của tôi không thành công không? Tôi có thể làm gì để đáp ứng các yêu cầu bắt tay của máy chủ? Tôi thực sự là vấn đề?

Trả lời

20

Theo https://www.ssllabs.com, máy chủ hỗ trợ bộ mã hóa

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 
TLS_DHE_RSA_WITH_AES_256_CBC_SHA 

Chúng được liệt kê là "bộ mật mã không khả dụng" như bạn có thể thấy trong thông báo gỡ lỗi.

Trong JRE/lib/security/local_policy.jar, chúng ta thấy

// Some countries have import limits on crypto strength. This policy file 
// is worldwide importable. 

grant { 
    permission javax.crypto.CryptoPermission "DES", 64; 
    permission javax.crypto.CryptoPermission "DESede", *; 
    permission javax.crypto.CryptoPermission "RC2", 128, 
            "javax.crypto.spec.RC2ParameterSpec", 128; 
    permission javax.crypto.CryptoPermission "RC4", 128; 
    permission javax.crypto.CryptoPermission "RC5", 128, 
      "javax.crypto.spec.RC5ParameterSpec", *, 12, *; 
    permission javax.crypto.CryptoPermission "RSA", *; 
    permission javax.crypto.CryptoPermission *, 128; 
}; 

Tải về và cài đặt "(JCE) Unlimited Strength Thẩm quyền Policy Files" - http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html - và tôi có thể khẳng định rằng vấn đề đã được giải quyết. Các tập tin đọc tôi nói

Do hạn chế nhập khẩu kiểm soát của một số nước, các phiên bản của các tập tin chính sách JCE được đóng gói trong Java Runtime Environment, hoặc JRE (TM), 8 môi trường cho phép "mạnh mẽ" nhưng mật mã giới hạn được sử dụng là . Gói tải xuống này (gói bao gồm tệp README này) cung cấp các tệp chính sách "sức mạnh không giới hạn" không chứa các hạn chế về độ mạnh mã hóa.

+0

Ồ, xin lỗi, tôi không thấy bạn trả lời. Tìm thấy giải pháp bản thân. Cảm ơn sự giúp đỡ của bạn! – Feinund

3

Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, ...

Không có AES256 bộ mã hoá được cung cấp bởi bạn Java client.

Lờ đi bộ mật mã không có sẵn: TLS_RSA_WITH_AES_256_CBC_SHA

Bởi vì họ không có sẵn trong ứng dụng của bạn. Tôi không phải là một chuyên gia Java, nhưng chúng không có sẵn trong Java của bạn hoặc chúng cần được kích hoạt một cách rõ ràng. Họ là cần thiết vì máy chủ chỉ hỗ trợ AES256 mật mã:

$ perl analyze-ssl.pl -v3 --all-ciphers trackobot.com 
... 
* supported ciphers with SSLv23 handshake 
* TLSv1_2 ECDHE-RSA-AES256-GCM-SHA384 
* TLSv1_2 ECDHE-RSA-AES256-SHA384 
* TLSv1_2 ECDHE-RSA-AES256-SHA 
* TLSv1_2 DHE-RSA-AES256-GCM-SHA384 
* TLSv1_2 DHE-RSA-AES256-SHA256 
* TLSv1_2 DHE-RSA-AES256-SHA 

Nó có thể là phiên bản của Java bạn sử dụng không có người hỗ trợ cho AES256 vì quy định xuất khẩu, xem https://knowledge.safe.com/articles/Error_Unexpected_Behavior/Enabling-AES256-in-the-Java-Runtime-Environment-for-Single-Sign-On

+1

Câu trả lời hay. Cấu hình Java mặc định không hỗ trợ AES256. Mô phỏng bắt tay với các máy khách Java mặc định (v6, 7, 8) đến trang này cho biết lỗi do không có bộ mã hóa chung. https://www.ssllabs.com/ssltest/analyze.html?d=trackobot.com –

2

Nhờ đoạn mã của Steffen Ullrich tôi đã kiểm tra mật mã java đã có sẵn. Rõ ràng, trong Java 8 bạn không có sức mạnh không giới hạn cho mật mã của bạn. Ví dụ, trong trường hợp của tôi, chương trình của tôi không thể sử dụng mật mã AES 256bit mà máy chủ yêu cầu.

Để giải quyết điều này, oracle cung cấp một gói các tệp chính sách cho phép mã hóa cường độ không giới hạn. Bạn có thể tìm thấy nó here.

Các trạng thái README:

Do hạn chế nhập khẩu kiểm soát của một số nước, các phiên bản của các tập tin chính sách JCE được đóng gói trong Java Runtime Environment, hoặc JRE (TM), 8 môi trường cho phép mã hóa "mạnh" nhưng hạn chế đến được sử dụng.

Chỉ cần tải xuống gói và thay thế các tệp thích hợp như được nêu trong hướng dẫn cài đặt. Sau khi tôi làm vậy, cái bắt tay làm việc như một sự quyến rũ.

Các vấn đề liên quan