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

我负责使用客户端证书进行身份validation的节点应用程序。 如果我使用HTTPS从浏览器直接连接到此应用程序,系统会提示input我的客户端证书,并且按预期工作。

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

如果我在节点应用程序上使用https,我似乎无法通过代理从nginx传递它。 我已经尝试将proxy_pass http:// my-upstream-entry改为https:// my-upstream-entry ,但在此之后,在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目标?

谢谢,

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

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

我认为你唯一的select是直接公开应用程序服务器来进行客户端连接,或者通过使用nginx stream模块代理实际的TCP连接到后端。