セキュリティで保護されたWebサービスに接続しようとしています。SSLハンドシェイク中にjavaがクライアント証明書を送信しないのはなぜですか?
キーストアとトラストストアが正しく設定されていても、ハンドシェークに失敗しました。
数日間の不満の後、無限のグーグルと私は周囲の人に尋ねましたが、唯一の問題は、Javaがハンドシェイク中にサーバーにクライアント証明書を送信しないことを選択したことでした。
具体的に:
- Serverは、クライアント証明書(CN = ROOTCAのCA)を要求した - すなわち、「私のルートCAによって署名された証明書を与える」
- をJavaがキーストアに見て、唯一の私のクライアントが発見しました「SubCA」によって署名され、「RootCA」によって発行される証明書。それはトラストストアを調べるのに気にしなかった...だから私はそう思うよ
- 悲しいことに、「SubCA」証明書をキーストアに追加しようとしたとき、それはまったく役に立たなかった。証明書がキーストアにロードされるかどうかを確認しました。これらは実行されますが、KeyManagerはクライアント以外のすべての証明書を無視します。
- Javaは、サーバーの要求を満たすすべての証明書を持っていないことを決定し
私の質問:-(何も... tadaaaハンドシェイクの失敗を送信しているという事実に上記リードのすべて:
- 「証明書チェーンを壊した」などの方法で「SubCA」証明書をキーストアに追加した可能性はありますか?KeyManagerはクライアント証明書のみを読み込み、残りは無視します(ChromeとopensslはそれでなぜJavaは使えないのですか? - 「SubCA」証明書は常に信頼できる権限として別々に表示されるので、Chrome appare正しくハンドシェイク中にクライアント証明書と一緒にパックします)
- これは正式な「設定上の問題」ですか?サーバーは第三者です。私はサーバーが、彼らが私たちに提供したものであるので、 "SubCA"権限によって署名された証明書を要求することを期待します。私はクロムとopensslで動作するという事実は、「あまり制限されていない」ためであり、Javaは「本によって」移動して失敗するためだと思う。
私はこれのために汚れた回避策を組み込むことができましたが、私はそれについて非常に幸せではないので、誰かが私のためにこれを明確にすることができたらうれしいです。
@ Brunoの回答には、プライベートキーがあり、対応する証明書(つまり、同じエイリアス)がないという理由が追加されました。これにより、Javaは 'CertificateRequest'メッセージで尋ねられたときにJavaを送信できませんでした。その他の理由としては、サーバーが指定した発行者によって署名された証明書がないか、またはサーバーが指定した暗号と一致する証明書がないことがあります。 – EJP
この問題は、サーバーで指定された暗号と一致するだけで解決しました。この情報をお寄せいただきありがとうございました。非常に便利でした。 –