【发布时间】: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_certificate和proxy_ssl_verify_depth的哪些设置?
我将 proxy_ssl_verify_depth 从 0 更改为 5,并使用上游服务器的 fullchain.pem、chain.pem 和 cert.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