nginx ssl_trusted_certificate 指令不起作用

use*_*858 6 nginx nginx-location nginx-reverse-proxy nginx-status

当我尝试使用此配置启动 nginx 服务器时,出现错误

nginx: [emerg] no ssl_client_certificate for ssl_client_verify
Run Code Online (Sandbox Code Playgroud)

我的配置看起来像

# HTTPS server
server {
    listen       4443;
    server_name  localhost;
    ssl                  on;
    ssl_certificate      /home/user/conf/ssl/server.pem;
    ssl_certificate_key  /home/user/conf/ssl/server.pem;
    ssl_protocols        TLSv1.2;

    ssl_verify_client optional;
    ssl_trusted_certificate /home/user/ssl/certs/certificate_bundle.pem;

    include conf.d/api_proxy.conf;
}
Run Code Online (Sandbox Code Playgroud)

根据错误,我应该使用ssl_client_certificate指令,但根据文档,如果我不想将证书列表发送给客户端,我应该使用ssl_trusted_certificate.

http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate

有人可以帮我弄清楚我错过了什么吗?

mxm*_*der 0

答案就在错误消息本身中:

nginx: [emerg] no ssl_client_certificate for ssl_client_verify
Run Code Online (Sandbox Code Playgroud)

ssl_client_verify如果您在配置中禁用,该错误将在下次启动 nginx 时消失。看来 的语义仅与其独占ssl_trusted_certificate使用有关,并且当其他配置指令发挥作用时,会受到“逻辑覆盖”的影响。

个人更喜欢启用的ssl_client_verify意思是:“客户端证书如果存在则进行验证;客户端不会获得有关 Web 服务器信任哪些客户端证书或权限的信息”。但是,当此信息可用时,我还可以看到对 TLS 握手进行故障排除的优势。从安全角度来看,我只能看到通过以下方式呈现给客户端的元数据openssl s_client:不存在恶意客户端可以用来尝试克隆/重建 CA 等的公钥或其他“签名关键”信息。

例如,使用您的配置对 nginx 的本地实例运行以下命令:

openssl s_client -key client.key -cert client.crt -connect localhost:443

...将在响应中显示结构类似于以下内容的数据:

Acceptable client certificate CA names
/CN=user/OU=Clients/O=Company/C=Location
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
Run Code Online (Sandbox Code Playgroud)

在我看来,上述的价值仅限于故障排除的价值。

您的 DN 结构(理想情况下)与“安全相关”无关(特别是如果上下文是面向 Internet 的 Web 服务)。

  • Nginx 的文档具有误导性,OP 的问题是有效的,老实说,这个答案没有为我澄清任何事情。所以我不想向客户端提供元数据,并且有相关指令。如何使用它? (2认同)