我负责一个使用客户端证书进行身份验证的节点应用程序。如果我从浏览器使用 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"
基于此,我有两个问题:
- 如何通过 proxy_pass 连接至已启用 TLS 的节点服务?
- 是否可以传递来自应用程序的客户端证书请求,然后将生成的证书传递给 proxy_passed 目标?
谢谢,
答案1
我认为,在 nginx 充当 TLS(SSL)端点的情况下,不可能通过 nginx 将客户端证书传递到 nginx 后面的应用程序服务器。这是因为 TLS 是 TLS 客户端(浏览器)和 TLS 终止器(nginx 或应用程序服务器)之间的端到端加密系统。所有 TLS 操作(客户端/服务器身份验证、加密等)都必须在客户端和服务器上进行。
您问题中的错误日志条目发生是因为 nginx 不知道如何处理客户端证书请求。
我认为您唯一的选择是直接向客户端连接公开应用程序服务器,或者使用 nginx 模块将实际的 TCP 连接代理到后端stream
。
详细说明可以在这里找到:https://serverfault.com/a/579668/423799