【问题标题】:Nginx `proxy_ssl_trusted_certificate` with letsencrypt upstream带有letsencrypt上游的Nginx`proxy_ssl_trusted_certificate`
【发布时间】:2021-05-12 15:06:37
【问题描述】:

我正在尝试将proxy_pass 与 nginx 一起使用,其中与上游服务器的连接已加密。上游服务器的证书是由letsencrypt certbot创建的。

# upstream server: nginx.conf

stream {
  server {
    listen 636 ssl;

    ssl_certificate /etc/letsencrypt/live/upstream.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/upstream.example.com/privkey.pem; # managed by Certbot

    # ...
  }
}

在下游服务器不验证代理证书时,一切正常。

# downstream server: nginx.conf

stream {
  server {
    listen 636 ssl;

    ssl_certificate /etc/letsencrypt/live/downstream.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/downstream.example.com/privkey.pem; # managed by Certbot

    proxy_ssl on;
    proxy_ssl_verify off;

    proxy_pass upstream.example.com:636;

    # ...

  }
}

但是,如果我尝试在下游服务器上验证上游证书,我会收到 upstream SSL certificate verify error: (2:unable to get issuer certificate) while SSL handshaking to upstream 在 nginx 错误日志中。

# downstream server: nginx.conf

stream {
  server {
    listen 636 ssl;

    ssl_certificate /etc/letsencrypt/live/downstream.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/downstream.example.com/privkey.pem; # managed by Certbot

    proxy_ssl on;
    proxy_ssl_verify on;
    proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream.example.com/chain.pem;
    proxy_ssl_verify_depth 2;

    proxy_pass upstream.example.com:636;

    # ...

  }
}

如果我尝试连接的上游服务器具有letsencrypt证书,我需要proxy_ssl_trusted_certificateproxy_ssl_verify_depth的哪些设置?

我将 proxy_ssl_verify_depth 从 0 更改为 5,并使用上游服务器的 fullchain.pemchain.pemcert.pem 替换 proxy_ssl_trusted_certificate,但每个都不成功。

附加信息

使用openssl 验证 CA 证书有效:

# openssl verify -verify_depth 2 chain.pem
chain.pem: OK

根据 CA 证书验证来自上游服务器 fullchain.pem 的证书有效:

# openssl verify -CAfile chain.pem fullchain.pem
fullchain.pem: OK

更多参考资料

【问题讨论】:

    标签: nginx ssl lets-encrypt nginx-reverse-proxy


    【解决方案1】:

    letsencrypt 或上游服务器未提供proxy_ssl_trusted_certificate 所需的 CA 证书。它已经安装在下游服务器上。

    在 Ubuntu 上,CA 证书的位置是 /etc/ssl/certs/ca-certificates.crt

    # downstream server: nginx.conf
    
    stream {
      server {
        listen 636 ssl;
    
        ssl_certificate /etc/letsencrypt/live/downstream.example.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/downstream.example.com/privkey.pem; # managed by Certbot
    
        proxy_ssl on;
        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
    
        proxy_pass upstream.example.com:636;
    
        # ...
    
      }
    }
    

    文档

    https://nginx.org/en/docs/http/ngx_http_proxy_module.html

    proxy_ssl_verify on |离开;

    启用或禁用代理 HTTPS 服务器证书的验证。

    proxy_ssl_verify_depth 编号;

    在代理的 HTTPS 服务器证书链中设置验证深度。

    proxy_ssl_trusted_certificate 文件;

    使用 PEM 格式的受信任 CA 证书指定文件,用于验证代理 HTTPS 服务器的证书。

    另见

    【讨论】:

      猜你喜欢
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2022-05-26
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      相关资源
      最近更新 更多