Nginx

如何使用 NGINX 作為具有客戶端證書的啟用 https 的服務的代理

  • March 14, 2019

我負責使用客戶端證書進行身份驗證的節點應用程序。如果我從瀏覽器使用 HTTPS 直接連接到此應用程序,系統會提示我輸入我的客戶端證書,並且一切正常。

如果我禁用 https 並使用 proxy_pass 將其作為啟用 HTTPS 的 nginx(使用相同的伺服器密鑰和證書)後面的 HTTP 伺服器執行,則不會提示我輸入客戶端證書。

如果我在節點應用程序上啟用 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 或應用程序伺服器)之間的端到端加密系統。所有 TLS 操作(客戶端/伺服器身份驗證、加密等)都必須在客戶端和伺服器上進行。

您的問題中出現錯誤日誌條目是因為 nginx 不知道如何處理客戶端證書請求。

我認為您唯一的選擇是直接為客戶端連接公開應用程序伺服器,或者使用 nginxstream模組將實際的 TCP 連接代理到後端。

詳細解釋可以看這裡:https ://serverfault.com/a/579668/423799

引用自:https://serverfault.com/questions/865350