私は基本認証で安心してwsを消費しようとしています。私はキーストアに何の証明書もインポートしなかった。クロムプラグインAdvance Rest client
を使用してテストします(base64でエンコードされたユーザー名:パスで基本認証を使用)。私は応答を見ることができます。ここまでは順調ですね。 しかし、私はこのWSを消費するためにJavaコードを開発するとき、私はSSLのhandsakeの失敗を取得:Spring RestTemplate: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 - 接続ホスト:私は、コマンドを実行すると、ポート
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サーバー:ポート
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 = [email protected]
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 = [email protected]
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/[email protected]
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/[email protected]
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
Chromeとあなたのアプリが異なるのJavaを使用するので、異なる設定を持っているかもしれません。 Javaが同じであっても、それがうまくいかない理由は何百万もあります。しかし、Chromeからうまく始めるのは良いスタートです。 '-Djavax.net.debug = ssl:handshake:verbose'を追加してあなたの質問に出力を追加するなど、JVMのSSLデバッグを有効にします。その他のデバッグ引数はhttp://docs.oracle.com/javase/7/から入手できます。 docs/technotes/guides/security/jsse/JSSERefGuide.html#Debug –
あなたのサーバがSSLを実行していないかのように 'ServerHello'メッセージがログに含まれていないので、あなたのサーバを調べます。あなたがopensslを持っているなら 'openssl s_client -showcerts -tls1 -connect [your_host]:[port]'で接続しようとします。 http://www.smartjava.org/content/how-analyze-java-ssl-errors –
おかげでミハルも参照してください。 opensslを実行するための出力を追加しました。私を助けてください。私はSSLと証明書のものに新しいです – David