nginx 如何验证证书(proxy_ssl_verify)?

nginx 如何验证证书(proxy_ssl_verify)?

考虑 nginx 的参数proxy_ssl_verifyproxy_ssl_trusted_certificate,用于保护与上游服务器的通信。

# downstream server: nginx.conf

stream {
  server {
    # ...

    proxy_ssl on;
    proxy_ssl_verify on;

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

  }
}

我的印象是,对于,nginx 会根据 验证上游服务器 ( )proxy_ssl on发送的证书。upstream.example.comproxy_ssl_trusted_certificate

然而,我遇到了一个问题,nginx 无法与上游服务器建立安全连接,并报告与上游 SSL 握手时,上游 SSL 证书验证错误:(2:无法获取颁发者证书),同时验证证书openssl是否有效。

# fullchain.pem: certificate sent by the upstream server
# chain.pem: CA certificate for `proxy_ssl_trusted_certificate`

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

这让我很疑惑 nginx 究竟是如何进行验证的。有没有办法单独重现此问题,以便调试错误发生的原因?

文档

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

proxy_ssl_verify 开启 | 关闭;

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

proxy_ssl_verify_depth 数字;

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

proxy_ssl_trusted_certificate 文件;

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

答案1

正如文档所述,proxy_ssl_trusted_certificate期望 CA 证书用于核实上游服务器的 TLS 证书。您似乎已提供该上游服务器的 TLS 证书链。请改为提供 CA 证书。

相关内容