web-dev-qa-db-ja.com

Nginxクライアント証明書の検証:ssl_client_certificateとssl_trusted_certificate

ssl_client_certificateのドキュメントには次のように書かれています。

Specifies a file with trusted CA certificates in the PEM format used to verify client certificates and OCSP responses if ssl_stapling is enabled.

The list of certificates will be sent to clients. If this is not desired, the ssl_trusted_certificate directive can be used. 

このリストがクライアントに送信されるのはなぜですか?クライアントの検証プロセスでは、クライアントが証明書(および中間体)をサーバーに送信して検証するようになっていると思いました。このプロパティが指すファイルが大きい場合、これは非効率ですか?

反対に、証明書をクライアントに送信したくない場合は、ssl_trusted_certificateを使用するように指示されています。 ssl_client_certificateを削除してssl_trusted_certificateのみを設定すると、ssl_verify_client on;があるためnginxが起動しません

4
jshort

TLSハンドシェイクの一部として、サーバーは(X.509証明書によるクライアント認証を要求するように構成されている場合)証明書要求をクライアントに送信します。このリクエストの一部は、サーバーが信頼するCA証明書のリストです。クライアントは、このリストのCA証明書の1つにチェーンするクライアント認証証明書を送信することが期待されています。

考えてみれば、サーバーで検証できない場合にクライアントが証明書を送信しても意味がないため、サーバーが信頼するCA証明書のリストを送信することは理にかなっています。サーバーが証明書を信頼しない場合、クライアントがサーバーに証明書を送信するのは非効率的です。これは特に、多くの証明書を持つクライアントに当てはまります。サーバーから信頼されることを期待して、すべての証明書を送信する必要があります。

nginxは、ssl_client_certificatesが指す証明書のファイルからこのリストを生成します。このリストを送信するか、ssl_verify_clientをオフにする必要があります。

これについては RFC 5246、セクション7.4.4 で読むことができ、そこにいる間は、TLSハンドシェイクのその他のすべての厄介な詳細について読むことができます。

5
garethTheRed