Spring RestTemplate:SSLハンドシェイクの失敗

ダビデ

基本認証でRESTfulWSを消費しようとしています。キーストアに証明書をインポートしませんでした。chromeプラグインを使用Advance Rest clientしてテストする場合(base64でエンコードされたusername:passで基本認証を使用)。返事が見えます。ここまでは順調ですね。しかし、このwsを使用するJavaコードを開発すると、SSLハンドスケエラーが発生します。

org.springframework.web.client.ResourceAccessException: I/O error: 
Received fatal alert: handshake_failure; nested exception is
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:377)
at test.Rest.main(Rest.java:37) Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.Alerts.getSSLException(Unknown Source)

私の質問は、問題がキーストアに証明書をインポートしなかったことが原因である場合、Javaコードとプラグインの両方が連携して機能しないはずです。ここでは、プラグインは機能しますが、私のコードは機能しません。理由は何ですか?私のコードに何か問題がありますか?

ベローは私のコードです

RestTemplate restTemplate = new RestTemplate();         
 String plainCreds = "username:pass"; 
 byte[] plainCredsBytes = plainCreds.getBytes(Charset.forName("US-ASCII") );     
 byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes); 
 String base64Creds = new String(base64CredsBytes);

 HttpHeaders headers = new HttpHeaders(); 
 headers.add("Authorization", "Basic " + base64Creds);

 ResponseEntity<String> response =  
          restTemplate.exchange("https://url",HttpMethod.GET,new  
                                  HttpEntity(headers),String.class);

ログファイルへのリンクは次のとおりです:(サーバー名をXXXXXXに置き換えました)http://www.filedropper.com/ssllog

実行後:openssl s_client -showcerts -tls1 -connect host:port

WARNING: can't open config file: /usr/local/ssl/openssl.cnf
CONNECTED(00000164)
8088:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:.\ssl\s3_pkt.c:362:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1452011344
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

これは、コマンドopenssl s_client -connect server:portを実行したときの出力です。

WARNING: can't open config file: /usr/local/ssl/openssl.cnf
CONNECTED(00000164)
depth=0 C = US, ST = "XXXXXX", L = XXXXXX, O = XXXXXX, OU = xxxxx, CN = XXXXXXXXX.test.intranet, emailAddress = xxxxx@xxxxx
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = US, ST = "XXXXXXX ", L = XXXXX, O = XXXXXX, OU = xxxxxx, CN = XXXXXXXXX.test.intranet, emailAddress = xxxxx@xxxxx
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/C=US/ST=XXXXXXX /L=XXXXX/O=XXXXXX/OU=XXXXX/CN=XXXXXX.test.intranet/emailAddress=xxxxx@xxxxx
   i:/DC=intranet/DC=xxxx/CN=XXXXXX DEV Issuing CA
---
Server certificate
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXX.....
-----END CERTIFICATE-----
subject=/C=US/ST=XXXXXXX /L=XXXXX/O=XXXXXX/OU=XXXXX/CN=XXXXXX.test.intranet/emailAddress=xxxxx@xxxxx
issuer=/DC=intranet/DC=XXX/CN=XXXXX DEV Issuing CA
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: XXXXX, P-256, 256 bits
---
SSL handshake has read 1895 bytes and written 443 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 568BF22A5CDBF103155264BBC056B272168AE0777CBC10F055705EB2DD907E5A
    Session-ID-ctx:
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1452012074
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
read:errno=0
ミハルフォクサ

javax.net.debugログから、Java 7を使用していて、クライアントがTLSv1に解決されていることがわかります。opensslサーバーがTLSv1をサポートしていないという出力から

TLSver。1.1および1.2は、Java7ではデフォルトで無効になっています。

Java SE7リリースのSunJSSEはTLS1.1およびTLS1.2をサポートしていますが、どちらのバージョンもクライアント接続に対してデフォルトで有効になっていません。一部のサーバーは上位互換性を正しく実装しておらず、TLS1.1またはTLS1.2クライアントとの通信を拒否します。相互運用性のために、SunJSSEはクライアント接続に対してデフォルトでTLS1.1またはTLS1.2を有効にしません。

次のいずれかの方法でTLSv1.1とTLSv1.2を有効にします。

  1. JVM引数:

    -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1
    
  2. または、Javaコードから同じプロパティを設定します。

    System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,TLSv1");
    
  3. または、Java7用のJCEUnlimitedStrengthポリシーファイルをインストールしますこの単一の手順で問題が解決するかどうかは100%わかりませんが、JVMで既存のアルゴリズムのより強力なバージョンを使用できるようにする一方で、JCEをインストールする価値は常にあります。

2016年9月29日更新

オプション1と2で、プロトコルの順序が良いものから悪いものへと変更されました(TLSバージョン1.2から1)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ClientHello後のSSLハンドシェイクの失敗

分類Dev

Logstash使用時のSSLハンドシェイクの失敗

分類Dev

OpenSSL :: SSL :: SSLError HomebrewOpenSSLでのハンドシェイクの失敗

分類Dev

SSL致命的エラー-ハンドシェイクの失敗(40)

分類Dev

SSLを使用したRMI:ハンドシェイクの失敗

分類Dev

XamarinでSSLハンドシェイクが失敗する

分類Dev

「sslv3アラートハンドシェイクの失敗:SSLアラート番号40」でSSLハンドシェイクが失敗する

分類Dev

「sslv3アラートハンドシェイクの失敗:SSLアラート番号40」でSSLハンドシェイクが失敗する

分類Dev

pythonはsslハンドシェイクの失敗を要求します

分類Dev

FacebookへのPhantomjs接続がSSLハンドシェイクに失敗する

分類Dev

ManagedBeanのインジェクションサービスSpringがNPEに失敗しました

分類Dev

Spring統合でSSLハンドシェイクタイムアウトを定義するオプションはありません

分類Dev

SSLハンドシェイクがAndroidクライアントからGoogleへの接続に失敗する

分類Dev

SSLハンドシェイクの失敗java.security.cert.CertPathValidatorException:証明書チェーンエラー

分類Dev

Scrapyのプロキシを使用したSSLハンドシェイクの失敗

分類Dev

Javaバージョン「1.7.0_79」でのSSLハンドシェイクの失敗

分類Dev

HerokuへのNginxリバースプロキシがSSLハンドシェイクに失敗する

分類Dev

Spring-boot + JPAEntityManagerインジェクトが失敗する

分類Dev

TLSv1ハンドシェイクの失敗

分類Dev

TLS接続ハンドシェイクの失敗

分類Dev

WebsocketSSLハンドシェイクの失敗

分類Dev

wgetsslアラートハンドシェイクの失敗

分類Dev

OpenSSLエラー-ハンドシェイクの失敗

分類Dev

Rails omniauth facebookSSLハンドシェイクの失敗

分類Dev

WeblogicSSLハンドシェイクの失敗

分類Dev

MosquittoOpenSSLハンドシェイクの失敗。

分類Dev

SSLルーチンで失敗するPayPalIPN確認応答:SSL3_READ_BYTES:sslv3アラートハンドシェイクの失敗

分類Dev

ハンドシェイクが失敗するのはなぜですか(Java SSL)

分類Dev

SSL23_GET_SERVER_HELLO:sslv3アラートハンドシェイクの失敗

Related 関連記事

  1. 1

    ClientHello後のSSLハンドシェイクの失敗

  2. 2

    Logstash使用時のSSLハンドシェイクの失敗

  3. 3

    OpenSSL :: SSL :: SSLError HomebrewOpenSSLでのハンドシェイクの失敗

  4. 4

    SSL致命的エラー-ハンドシェイクの失敗(40)

  5. 5

    SSLを使用したRMI:ハンドシェイクの失敗

  6. 6

    XamarinでSSLハンドシェイクが失敗する

  7. 7

    「sslv3アラートハンドシェイクの失敗:SSLアラート番号40」でSSLハンドシェイクが失敗する

  8. 8

    「sslv3アラートハンドシェイクの失敗:SSLアラート番号40」でSSLハンドシェイクが失敗する

  9. 9

    pythonはsslハンドシェイクの失敗を要求します

  10. 10

    FacebookへのPhantomjs接続がSSLハンドシェイクに失敗する

  11. 11

    ManagedBeanのインジェクションサービスSpringがNPEに失敗しました

  12. 12

    Spring統合でSSLハンドシェイクタイムアウトを定義するオプションはありません

  13. 13

    SSLハンドシェイクがAndroidクライアントからGoogleへの接続に失敗する

  14. 14

    SSLハンドシェイクの失敗java.security.cert.CertPathValidatorException:証明書チェーンエラー

  15. 15

    Scrapyのプロキシを使用したSSLハンドシェイクの失敗

  16. 16

    Javaバージョン「1.7.0_79」でのSSLハンドシェイクの失敗

  17. 17

    HerokuへのNginxリバースプロキシがSSLハンドシェイクに失敗する

  18. 18

    Spring-boot + JPAEntityManagerインジェクトが失敗する

  19. 19

    TLSv1ハンドシェイクの失敗

  20. 20

    TLS接続ハンドシェイクの失敗

  21. 21

    WebsocketSSLハンドシェイクの失敗

  22. 22

    wgetsslアラートハンドシェイクの失敗

  23. 23

    OpenSSLエラー-ハンドシェイクの失敗

  24. 24

    Rails omniauth facebookSSLハンドシェイクの失敗

  25. 25

    WeblogicSSLハンドシェイクの失敗

  26. 26

    MosquittoOpenSSLハンドシェイクの失敗。

  27. 27

    SSLルーチンで失敗するPayPalIPN確認応答:SSL3_READ_BYTES:sslv3アラートハンドシェイクの失敗

  28. 28

    ハンドシェイクが失敗するのはなぜですか(Java SSL)

  29. 29

    SSL23_GET_SERVER_HELLO:sslv3アラートハンドシェイクの失敗

ホットタグ

アーカイブ