1

クライアント検証をオンにして SSL 接続を作成するための 2 つのシナリオがあります。

1-私のAndroidクライアントとサーバーには、同じCAによって署名された証明書があり、サーバーでのクライアント検証が有効になっています。trustmanager キーストアに CA 証明書をロードし、keymanager キーストアにクライアント キー + 証明書 + ca をロードして、これを ssl.init(keymanager, trustmanager) に渡します。それは正常に機能し、両側の交換と相互の証明書の検証を行います。

2-これで、異なるCAによって署名されたクライアント証明書とサーバー証明書があります。たとえば、サーバー証明書はServerCAによって署名され、クライアントはClientCAによって署名されています。上記のプロセスを繰り返しますが、サーバーが要求したときにクライアントは証明書を送信しません。なぜですか?

  • ssl.init の keymanager と trustmanager の間のリンクは何ですか?
4

1 に答える 1

3

クライアント証明書は、証明書要求メッセージの TLS ハンドシェーク中にサーバーによって要求されます。このメッセージには、サーバーが受け入れようとする証明機関 (サブジェクト DN) のリストが含まれています。

クライアントは通常、これを使用して、送信する証明書を選択します (また、送信するかどうかを選択します): クライアントが証明書チェーンを持っている場合、リスト内の CA の 1 つにつながる可能性があり、そのチェーンを使用します。

を使用openssl s_client -connect the.host.name:443すると、サーバー証明書のセクションの後に、受け入れ可能な CA のリストが表示されます。

クライアントにそれらのいずれかにつながるチェーンがない場合、クライアント証明書が使用される可能性は低くなります。この場合、Java のようなクライアントがクライアント証明書を使用しない一般的な原因は、キーストアに中間証明書なしでクライアント証明書をインポートしたことです (この質問を参照してください)。もう 1 つの潜在的な原因は、このサーバーが、他のクライアント証明書 (中間 CA 証明書の有無にかかわらず) を発行した CA についてまったく知らないことです。(ここでは、サーバーが空のリストを送信しないと想定しています。)

于 2012-08-28T14:34:13.543 に答える