5

私は基本認証で安心して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 
+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 –

+0

あなたのサーバがSSLを実行していないかのように 'ServerHello'メッセージがログに含まれていないので、あなたのサーバを調べます。あなたがopensslを持っているなら 'openssl s_client -showcerts -tls1 -connect [your_host]:[port]'で接続しようとします。 http://www.smartjava.org/content/how-analyze-java-ssl-errors –

+0

おかげでミハルも参照してください。 opensslを実行するための出力を追加しました。私を助けてください。私はSSLと証明書のものに新しいです – David

答えて

7

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

TLS ver. 1.1 and 1.2 are disabled in Java 7 by default.

のJava SE 7リリースのSunJSSEは、TLS 1.1およびTLS 1.2をサポートしていますが、どちらのバージョンは、クライアント接続のためのデフォルトで有効になっています。一部のサーバーでは、前方互換性が正しく実装されていないため、 はTLS 1.1またはTLS 1.2クライアントとの通信を拒否します。相互運用性のために、 クライアント の接続では、SunJSSEはデフォルトでTLS 1.1またはTLS 1.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. またはJCE Unlimited Strength policy files for Java 7をインストールしてください。この単一のステップで問題を解決できるかどうかは100%確信しているわけではありませんが、JVMが既存のアルゴリズムのより強力なバージョンを使用できるようにしながら、JCEをインストールすることは常に価値があります。

UPDATE 29/9月/ 2016:オプション1および2のより良いから悪いにプロトコルの

変更順序(TLS 1版1.2。)。

+0

あなたの患者さんが私を助けてくれてありがとうミハエルに感謝します。残りの部分をホストするサーバーはjdk8を使用しており、クライアントはjdk7を使用しています。そこで私たちはjdk7にサーバーをダウングレードしました。また、-Dhttps.protocols = TLSv1、TLSv1.1、TLSv1.2を使用してjdkにTSLv1.2を強制的に使用させる必要があります。それは今働いている。 – David

+0

を実行してから、-Dhttps.protocols = TLSv1、TLSv1.1、TLSv1.2を使用してください。私もjdk7のJCE Unlimited Strengthポリシーをインストールしようとしました。私はjdk/jre/lib/securityのファイルをzipファイルのファイルに置き換えました。しかし、それは動作しません。 – David

+0

あなたはDavidを歓迎しており、感謝の気持ちで感謝の意を表します。 –

1

Java 7を使用している場合は、TLSv1.2プロトコルを使用するようにJavaに明示的に指示する必要があります。ここでは、Spring XML設定を使用した例を示します。

***In any Spring bean (i.e. a controller)*** 

import org.apache.http.client.HttpClient; 
import org.apache.http.ssl.SSLContexts; 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
import org.apache.http.impl.client.HttpClients; 
import javax.net.ssl.SSLContext; 

@Bean(name="client") 
public HttpClient make() throws NoSuchAlgorithmException, KeyManagementException { 
    SSLContext sslContext = SSLContexts.custom().build(); 
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, 
      new String[]{"TLSv1.2", "TLSv1.1"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier()); 
    return HttpClients.custom() 
      .setSSLSocketFactory(sslConnectionSocketFactory) 
      .build(); 
} 

***In XML configuration files*** 

<bean id="factory" 
     class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
    <property name="httpClient" ref="client"/> 
</bean> 
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <property name="requestFactory" ref="factory"/> 
</bean> 

あなたはこのような何かをXMLせずに同じことを行うことができます:

RestTemplate restTemplate; 

public HttpClient getHttpClient() throws NoSuchAlgorithmException, KeyManagementException { 
    SSLContext sslContext = SSLContexts.custom().build(); 
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, 
      new String[]{"TLSv1.2", "TLSv1.1"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier()); 
    return HttpClients.custom() 
      .setSSLSocketFactory(sslConnectionSocketFactory) 
      .build(); 
} 

public void setUp() throws Exception { 
    restTemplate = new RestTemplate(
      new HttpComponentsClientHttpRequestFactory(
        getHttpClient())); 
    ... 
} 
関連する問題