如何使用 NGINX 作为具有客户端证书的 https 服务的代理

如何使用 NGINX 作为具有客户端证书的 https 服务的代理

我负责一个使用客户端证书进行身份验证的节点应用程序。如果我从浏览器使用 HTTPS 直接连接到此应用程序,系统会提示我输入客户端证书,并且一切正常。

如果我禁用 https 并使用 proxy_pass 将其作为启用 HTTPS 的 nginx(使用相同的服务器密钥和证书)后面的 HTTP 服务器运行,则系统不会提示我输入客户端证书。

如果我在节点应用程序上启用 https,我似乎无法从 nginx 代理传递它。我尝试更改 proxy_passhttp://我的上游入口https://我的上游入口,但此后,我在 nginx 错误日志中收到类似以下内容的消息:

2017/07/26 17:55:10 [error] 6687#6687: *380 upstream prematurely closed connection while reading response from upstream, client: 192.168.10.1, server: _, request: "GET /login HTTP/1.1", upstream: "http://127.0.0.1:1234/login"

基于此,我有两个问题:

  1. 如何通过 proxy_pass 连接至已启用 TLS 的节点服务?
  2. 是否可以传递来自应用程序的客户端证书请求,然后将生成的证书传递给 proxy_passed 目标?

谢谢,

答案1

我认为,在 nginx 充当 TLS(SSL)端点的情况下,不可能通过 nginx 将客户端证书传递到 nginx 后面的应用程序服务器。这是因为 TLS 是 TLS 客户端(浏览器)和 TLS 终止器(nginx 或应用程序服务器)之间的端到端加密系统。所有 TLS 操作(客户端/服务器身份验证、加密等)都必须在客户端和服务器上进行。

您问题中的错误日志条目发生是因为 nginx 不知道如何处理客户端证书请求。

我认为您唯一的选择是直接向客户端连接公开应用程序服务器,或者使用 nginx 模块将实际的 TCP 连接代理到后端stream

详细说明可以在这里找到:https://serverfault.com/a/579668/423799

相关内容