安全な Web サービスに接続しようとしています。
キーストアとトラストストアが正しく設定されていても、ハンドシェイクに失敗しました。
数日間の欲求不満、際限のないグーグル検索、および周囲の人への質問の後、唯一の問題は、ハンドシェイク中にJavaがクライアント証明書をサーバーに送信しないことを選択したことであることがわかりました。
具体的には:
- サーバーがクライアント証明書 (CN=RootCA) を要求しました - つまり、「ルート CA によって署名された証明書をください」
- Java がキーストアを調べたところ、「RootCA」によって発行された「SubCA」によって署名されたクライアント証明書のみが見つかりました。トラストストアを調べることは気にしませんでした...当たり前のことだと思います
- 残念ながら、「SubCA」証明書をキーストアに追加しようとしても、まったく役に立ちませんでした。証明書がキーストアにロードされるかどうかを確認しました。それらはそうしますが、KeyManager はクライアントのものを除くすべての証明書を無視します。
- 上記のすべてにより、Javaはサーバーの要求を満たす証明書がないと判断し、何も送信しないという事実につながります...tadaaaハンドシェイクの失敗:-(
私の質問:
- KeyManagerがクライアント証明書のみをロードし、残りを無視するように、「証明書チェーンを壊す」などの方法で「SubCA」証明書をキーストアに追加した可能性はありますか? (Chromeとopensslはそれを理解することができたのに、なぜjavaできないのでしょうか?-「SubCA」証明書は常に信頼できる機関として個別に提示されるため、Chromeはハンドシェイク中にクライアント証明書と一緒に明らかに正しくパックすることに注意してください)
- これはサーバー側の正式な「構成の問題」ですか? サーバーはサードパーティです。サーバーが「SubCA」機関によって署名された証明書を要求することを期待します。それが提供されたものだからです。これがChromeとopensslで機能するという事実は、それらが「制限が緩い」ためであり、Javaは「本通りに」失敗するためだと思います。
私はなんとかこれに対する汚い回避策をまとめましたが、あまり満足していないので、誰かが私のためにこれを明確にしてくれるとうれしいです.