马上就有几篇帖子讨论了这个问题,但我不确定这些设置到底起到了什么作用,才能达到正确的结果。我可以验证客户端,但反之则不行。我希望客户端验证来自服务器的内容。
server {
listen 443 ssl;
client_max_body_size 60M;
server_name example.com;
ssl_certificate /letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
ssl_prefer_server_ciphers on;
# Cadeia de Certificados
ssl_client_certificate /etc/nginx/certificados/cadeia-certificados.pem;
# Valida a hierarquia ( https://stackoverflow.com/questions/8431528/nginx-ssl-certificate-authentication-signed-by-intermediate-ca-chain )
ssl_verify_depth 2;
# Certificados revogados
# ssl_crl /etc/nginx/certificados/ca.crl;
# Exige o certificad do cliente
ssl_verify_client on;
location / {
# Passa o certificado obtido em formato pem para a aplicação
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-Ssl on;
# proxy_set_header X-SSL-CERT $ssl_client_cert;
proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
proxy_pass http://10.0.0.1:3000;
}
我的问题是关于来自要点的示例帖子。
我想要的是。
我想在我的设备和 nginx 负载均衡器之间建立 mTLS。我的方法可行,但我的 mqtt 客户端模拟器(即 emqx)的设置有 SSL 安全设置。即
客户端是否验证服务器的证书链和主机名。
当我使用该设置时,出现错误。Error: unable to verify the first certificate
令我困惑的是,我需要在存储的客户端 CA 上拥有什么,以便将其与客户端 crt 和客户端密钥一起传送到 Nginx 服务器 lb。
ssl_client_certificate 是否是实现此功能所需的?我有这个证书,所以我不明白为什么会出错。我可以将中间证书放入链中。目前只有根证书。
另外,我并没有真正看到 ssl_certificate 如何验证客户端和客户端如何验证服务器。您的示例中有一个 let's encrypt,我想要类似的设置,但这是一个公共 CA,因此看不到它如何通过以下设置对客户端证书验证器起作用。
意思是,let's encrypt 与什么有关。密钥与什么有关?这些密钥证书与 ssl_client_certificate 无关
这是我的配置。从设备/客户端,我提供client.crt,client.key和包含中间证书的CA。
streams:
ignored_key: |
stream {
upstream backend {
server emqx-ee:1883;
}
server {
listen *:31882 ssl;
proxy_pass backend;
ssl_certificate /mnt/nginx/certs/custom/intermediate-ca.crt;
ssl_certificate_key /mnt/nginx/certs/custom/intermediate-ca.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 4h;
ssl_handshake_timeout 30s;
ssl_client_certificate /mnt/nginx/certs/custom/root-ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
}
}