当我尝试使用此配置启动nginx服务器时出现错误
nginx: [emerg] no ssl_client_certificate for ssl_client_verify
我的配置看起来像
# 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;
}
根据错误,我应该使用ssl_client_certificate
指令,但根据文档,如果我不想将证书列表发送给客户,我应该使用ssl_trusted_certificate
。
http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate
有人可以帮我弄清楚我错过了什么吗?
答案 0 :(得分:1)
答案在错误消息本身中:
nginx: [emerg] no ssl_client_certificate for ssl_client_verify
如果在配置中禁用ssl_client_verify
,则在下次启动nginx时该错误将消失。看来ssl_trusted_certificate
的语义仅与它的排他性使用有关,并且在其他配置指令在起作用时受“逻辑覆盖”的约束。
尽管我个人会更喜欢,但这种状态是“如果提供了客户端证书,将被验证;不向客户端提供有关Web服务器信任哪些客户端证书或授权的信息”。但是,当此信息可用时,我也可以看到解决TLS握手问题的优势。从安全角度来看,我只看到通过openssl s_client
向客户端提供了元数据;没有恶意客户端可以用来例如克隆/重建CA的公共密钥或其他“签名关键”信息。
例如:
openssl s_client -key client.key -cert client.crt -connect localhost:443
在您的nginx配置上运行会在响应中显示类似于以下内容的数据(即IMO,其值仅限于故障排除):
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
理想情况下,您的DN结构与“安全性无关”(如果上下文是面向Internet的Web服务)。