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の こんにちはあります
私はプログラムコードからキーストアとトラストストアを使いたいと思っています。動的に変化するそれ以降は
あなたの編集では、サーバーのSSLログを見て、何が間違っていたのかを確認する必要があります。クライアントが「証明書」メッセージを送信した場合、クライアント証明書は機能しています。 – EJP
ありがとうございました。私はサーバーにアクセスできませんが、クライアントのキー交換の後でデータを交換すると、エラーが発生していると推測しています。サーバーに間違ったデータを渡した可能性があります –