76

安全な Web サービスに接続しようとしています。

キーストアとトラストストアが正しく設定されていても、ハンドシェイクに失敗しました。

数日間の欲求不満、際限のないグーグル検索、および周囲の人への質問の後、唯一の問題は、ハンドシェイク中にJavaがクライアント証明書をサーバーに送信しないことを選択したことであることがわかりました。

具体的には:

  1. サーバーがクライアント証明書 (CN=RootCA) を要求しました - つまり、「ルート CA によって署名された証明書をください」
  2. Java がキーストアを調べたところ、「RootCA」によって発行された「SubCA」によって署名されたクライアント証明書のみが見つかりました。トラストストアを調べることは気にしませんでした...当たり前のことだと思います
  3. 残念ながら、「SubCA」証明書をキーストアに追加しようとしても、まったく役に立ちませんでした。証明書がキ​​ーストアにロードされるかどうかを確認しました。それらはそうしますが、KeyManager はクライアントのものを除くすべての証明書を無視します。
  4. 上記のすべてにより、Javaはサーバーの要求を満たす証明書がないと判断し、何も送信しないという事実につながります...tadaaaハンドシェイクの失敗:-(

私の質問:

  1. KeyManagerがクライアント証明書のみをロードし、残りを無視するように、「証明書チェーンを壊す」などの方法で「SubCA」証明書をキーストアに追加した可能性はありますか? (Chromeとopensslはそれを理解することができたのに、なぜjavaできないのでしょうか?-「SubCA」証明書は常に信頼できる機関として個別に提示されるため、Chromeはハンドシェイク中にクライアント証明書と一緒に明らかに正しくパックすることに注意してください)
  2. これはサーバー側の正式な「構成の問題」ですか? サーバーはサードパーティです。サーバーが「SubCA」機関によって署名された証明書を要求することを期待します。それが提供されたものだからです。これがChromeとopensslで機能するという事実は、それらが「制限が緩い」ためであり、Javaは「本通りに」失敗するためだと思います。

私はなんとかこれに対する汚い回避策をまとめましたが、あまり満足していないので、誰かが私のためにこれを明確にしてくれるとうれしいです.

4

4 に答える 4

112

クライアント証明書とその秘密鍵があるエントリに関連付けずに、中間 CA 証明書をキーストアにインポートした可能性があります。を使用してこれを確認できるはずですkeytool -v -list -keystore store.jks。エイリアス エントリごとに証明書を 1 つしか取得しない場合、それらは一緒ではありません。

証明書とそのチェーンを一緒に、秘密鍵を持つキーストア エイリアスにインポートする必要があります。

どのキーストア エイリアスに秘密鍵があるかを調べるには、keytool -list -keystore store.jks(ここでは JKS ストア タイプを想定しています) を使用します。これにより、次のようなことがわかります。

Your keystore contains 1 entry

myalias, Feb 15, 2012, PrivateKeyEntry, 
Certificate fingerprint (MD5): xxxxxxxx

ここで、別名はmyalias. -vこれに加えて使用すると、 が表示されますAlias Name: myalias

まだ個別に持っていない場合は、クライアント証明書をキーストアからエクスポートします。

keytool -exportcert -rfc -file clientcert.pem -keystore store.jks -alias myalias

これにより、PEM ファイルが生成されます。

テキスト エディター (または ) を使用して、そのクライアント証明書と中間 CA 証明書 (必要に応じてルート CA 証明書自体) を含むcatファイル ( と呼びましょう) を準備し、クライアント証明書が最初とその発行者になるようにします。bundle.pem証明書はすぐ下にあります。

これは次のようになります。

-----BEGIN CERTIFICATE-----
MIICajCCAdOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVSzEa
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICkjCCAfugAwIBAgIJAKm5bDEMxZd7MA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV
....
-----END CERTIFICATE-----

次に、このバンドルを一緒に、秘密鍵があるエイリアスにインポートします。

keytool -importcert -keystore store.jks -alias myalias -file bundle.pem
于 2012-02-15T20:21:31.253 に答える