2016-12-07 20 views
2

Javaを使用してWebサービスへの2ウェイTSL接続を確立しようとしています。私は秘密鍵と3つの証明書の証明書チェーンを持つpfx証明書を与えられています。ここでは、Springフレームワークを使用したJavaコードは次のとおりです。ハンドシェイクの失敗証明書チェーンを使用するクライアント鍵交換

@Bean 
public Client weatherClient(Jaxb2Marshaller marshaller) throws Exception { 
    Client client = new Client(); 
    client.setDefaultUri("....."); 
    client.setMarshaller(marshaller); 
    client.setUnmarshaller(marshaller); 

    KeyStore ks = KeyStore.getInstance("PKCS12"); 
    ks.load(keyStore.getInputStream(), keyStorePassword.toCharArray()); 

    LOGGER.info("Loaded keystore: " + keyStore.getURI().toString()); 
    System.out.println("Loaded keystore: " + keyStore.getURI().toString()); 

    keyStore.getInputStream().close(); 


    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());//KeyManagerFactory.getDefaultAlgorithm() 
    keyManagerFactory.init(ks, keyStorePassword.toCharArray()); 

    KeyStore ts = KeyStore.getInstance("PKCS12"); 
    ts.load(trustStore.getInputStream(), trustStorePassword.toCharArray());// 
    LOGGER.info("Loaded trustStore: " + trustStore.getURI().toString()); 
    System.out.println("Loaded trustStore: " + trustStore.getURI().toString()); 

    trustStore.getInputStream().close(); 

    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(ts); 

    HttpsUrlConnectionMessageSender messageSender = new HttpsUrlConnectionMessageSender(); 
    messageSender.setKeyManagers(keyManagerFactory.getKeyManagers()); 
    messageSender.setTrustManagers(trustManagerFactory.getTrustManagers()); 
    client.setMessageSender(messageSender); 
    return client; 
} 

これまでのところ、私は証明書を送信し、私が見つけた信頼できる証明書を取得したClientHelloととのServerHelloを取得します。次に証明書が見つからない証明書があります

*** CertificateRequest 
Cert Types: RSA, DSS 
Cert Authorities: 
<CN=Thawte SSL CA, O="Thawte, Inc.", C=US> 
.... 
.... 
*** ServerHelloDone 
Warning: no suitable certificate found - continuing without client authentication 
*** Certificate chain 
<Empty> 
*** 

私は証明書を個別にlib/security/cacertsに追加しました。 証明書が追加される唯一の場所であれば、同じ動作をするので、最初の証明書交換はcacertsのキーストアから行われるようです。要求は証明書チェーンを探しているようですが、秘密鍵と証明書チェーンを持つpkcs12としてKeyStoreオブジェクトにインポートしても、証明書チェーンを見つけることができません。すべてのヘルプは

UPDATE

をいただければ幸い私はそれが上記の警告によるものであったが、私はそれについて間違っているかもしれない、私は推定ClientKeyExchange後の握手失敗を取得しています。

*** ClientKeyExchange, RSA PreMasterSecret, TLSv1 
main, WRITE: TLSv1 Handshake, length = 269 
SESSION KEYGEN: 
PreMaster Secret: 
.... 
.... 
0000: B0 E2 38 5E 40 4E 7C C5       ..8^@N.. 
Server write IV: 
0000: 44 40 45 E1 82 45 15 9B       [email protected] 
main, WRITE: TLSv1 Change Cipher Spec, length = 1 
*** Finished 
verify_data: { 109, 220, 225, 98, 98, 233, 48, 215, 61, 50, 58, 207 } 
*** 
main, WRITE: TLSv1 Handshake, length = 40 
main, READ: TLSv1 Alert, length = 2 
main, RECV TLSv1 ALERT: fatal, handshake_failure 
%% Invalidated: [Session-1, SSL_RSA_WITH_3DES_EDE_CBC_SHA] 

UPDATE

私は変数-Djavax.net.ssl.keyStore= としてではなくて、私は次のように取得する変数として、キーストアを追加することで、キーストアを追加した場合、相互認証が機能します。コード内で指定されたキーストアとトラストストアが見出され、証明書チェーン、およびトラスト・ストアは、デバッグ

*** 
found key for : devcert 
chain [0] = [ 
[ 
    Version: V3 ...... 

*** 
adding as trusted cert: 
    Subject: 

そして空のキーストアが示されているとJVMのcacertsは、信頼できる証明書として使用されるに示されています。

keyStore is : 
keyStore type is : jks 
keyStore provider is : 
init keystore 
init keymanager of type SunX509 
trustStore is: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts 
trustStore type is : jks 
trustStore provider is : 
init truststore 
adding as trusted cert: 
    Subject: CN=ubuntu 

そしてサーバ証明書をキーストアと

*** 
    Found trusted certificate: 
but the Certificate Request does find a matching certificate as above, unless it is added as a variable 
*** CertificateRequest 
Cert Types: RSA, DSS 
Cert Authorities: 
<CN=Thawte SSL CA, O="Thawte, Inc.", C=US> 
.... 
.... 
*** ServerHelloDone 
Warning: no suitable certificate found - continuing without client authentication 
*** Certificate chain 
<Empty> 
*** 

動作がvarible -Djavax.net.ssl.keyStore=

*** ServerHelloDone 
matching alias: devcert 
*** Certificate chain 
chain [0] = [ 
[ 
    Version: V3 
として添加発見される ***のServerHello、TLSv1の こんにちはあります

私はプログラムコードからキーストアとトラストストアを使いたいと思っています。動的に変化するそれ以降は

+0

あなたの編集では、サーバーのSSLログを見て、何が間違っていたのかを確認する必要があります。クライアントが「証明書」メッセージを送信した場合、クライアント証明書は機能しています。 – EJP

+0

ありがとうございました。私はサーバーにアクセスできませんが、クライアントのキー交換の後でデータを交換すると、エラーが発生していると推測しています。サーバーに間違ったデータを渡した可能性があります –

答えて

1

には秘密鍵が与えられています。これはすでに大きなセキュリティ違反です。実際の問題は、証明書がCertificateRequestメッセージに記載されているCAによって署名されていないか、証明書に記載されているタイプではないことです。

+0

私はディスク上の秘密鍵を持つ.pfxファイルが与えられました。 SoapUIを使って証明書を使ってサービスに接続できます。証明書はKey Algorithm:RSA –

+0

タイプであり、Thawteによって署名されていません。 – EJP

+0

ありがとう、私は私のブラウザを介してThawteの証明書を取得し、私が致命的になっていない、cacertsのキーストアにインポートされましたserverHelloフェーズでdescription = certificate_unknown –

関連する問題