NGINX:配置使用 ssl_client_certificate、ssl_verify_client、ssl_certificate 和 ssl_certificate_key 设置 mTLS

NGINX:配置使用 ssl_client_certificate、ssl_verify_client、ssl_certificate 和 ssl_certificate_key 设置 mTLS

马上就有几篇帖子讨论了这个问题,但我不确定这些设置到底起到了什么作用,才能达到正确的结果。我可以验证客户端,但反之则不行。我希望客户端验证来自服务器的内容。

要旨

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;
      }
    }

相关内容