1. ホーム
  2. java

なぜjavaはSSLハンドシェイク中にクライアント証明書を送信しないのでしょうか?

2023-08-26 04:55:47

質問

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

鍵屋とトラストストアが正しく設定されているにもかかわらず、ハンドシェイクに失敗してしまいました。

数日間のフラストレーション、終わりのないグーグル検索、および周囲への問い合わせの後、唯一の問題は、java がハンドシェイク中にクライアント証明書をサーバーに送信しないことを選択したことだとわかりました。

具体的には

  1. サーバーがクライアント証明書 (CN=RootCA) を要求した - すなわち "ルート CA" によって署名された証明書を私に与えてください。
  2. Java は鍵ストアを調べ、私のクライアント証明書を見つけましたが、それは "SubCA" によって署名され、さらに "RootCA" によって発行されました。これは、トラストストアをわざわざ調べようとはしませんでした......。
  3. 悲しいことに、私が "SubCA" 証明書をキーストアに追加しようとしたとき、それはまったく役に立ちませんでした。私は、証明書が鍵ストアに読み込まれるかどうかを確認しました。しかし、KeyManager は、クライアント証明書以外のすべての証明書を無視します。
  4. 上記のすべてが、java がサーバーの要求を満たす証明書がないと判断し、何も送信しないという事実につながります。

私の質問です。

  1. 私が "SubCA" 証明書を鍵ストアに追加して、quot;証明書チェーンを破壊したとか、KeyManager がクライアント証明書だけをロードして残りを無視したとかいうことはありえますか? (Chromeとopensslはそれを理解することができたのに、なぜjavaはできないのでしょうか?- ちなみに、quot;SubCA"の証明書は、常に信頼できる機関として別々に提示されるので、Chromeは明らかにハンドシェイク中にクライアント証明書と一緒に正しくパックします)
  2. これはサーバー側の正式な "設定の問題" なのでしょうか?サーバーはサード パーティです。私は、サーバーが "SubCA"機関が提供したものであるため、その機関が署名した証明書を要求することを期待します。Chromeとopensslでこれが動作するのは、制限が少ないからで、javaは本に従って失敗しているだけだと思われます。

私はこのために汚い回避策を何とかまとめましたが、あまり満足していないので、誰かが私のためにこのことを明確にすることができれば嬉しく思います。

どのように解決するのですか?

クライアント証明書とその秘密鍵があるエントリと関連付けることなく、中間 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ファイルができるはずです。

テキストエディタを使って(あるいは cat ) を使って、ファイル (仮に bundle.pem にクライアント証明書と中間CA証明書(必要ならルートCA証明書も)、クライアント証明書が先頭でそのすぐ下に発行者証明書が来るように準備します。

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

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

さて、このバンドルを秘密鍵のあるエイリアスにインポートし直します。

keytool -importcert -keystore store.jks -alias myalias -file bundle.pem