Nginx 客户端证书验证:ssl_client_certificate 与 ssl_trusted_certificate

jsh*_*ort 9 ssl nginx ssl-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. 
Run Code Online (Sandbox Code Playgroud)

为什么将此列表发送给客户?我认为客户端验证过程让客户端将其证书(和中间体)发送到服务器进行验证。如果此属性指向的文件很大,这是否效率低下?

另一方面,它表示ssl_trusted_certificate如果您不想将证书发送给客户端,则使用。如果我删除ssl_client_certificate并仅设置,ssl_trusted_certificate则 nginx 不会启动,因为我有ssl_verify_client on;

gar*_*Red 10

作为 TLS 握手的一部分,服务器将(如果配置为需要通过 X.509 证书进行客户端身份验证)将证书请求发送回客户端。此请求的一部分是服务器信任的 CA 证书列表。客户端应该发送一个客户端身份验证证书,该证书链接到此列表中的 CA 证书之一。

仔细想想,如果服务器无法验证,客户端发送证书是没有意义的,因此服务器发送它信任的CA证书列表是有意义的。如果服务器不信任它们,客户端将证书发送到服务器将是低效的。对于具有许多证书的客户端尤其如此 - 它必须将它们全部发送以希望服务器信任一个。

nginx从 指向的证书文件生成此列表ssl_client_certificate。您需要发送此列表或关闭ssl_verify_client

另请注意,ssl_trusted_certificate将验证客户端证书,但此指令指向的文件中的证书不会作为 TLS 握手的一部分发送给客户端。相反,当配置 OCSP 装订时,这些 CA 证书可用于验证 OCSP 响应。

您可以在RFC 5246 的第 7.4.4 节中阅读有关它的内容,同时您还可以阅读有关 TLS 握手的所有其他血腥细节。