Nginx

Nginx 到 Tomcat SSL 代理

  • April 20, 2018

我已經為客戶端身份驗證配置了一個帶有 SSL 的 tomcat 應用程序。它位於埠 8443 上。它工作正常,因此當我嘗試使用客戶端證書(client.p12)訪問 tomcat 時,我獲得了成功,而另一個不在密鑰庫中的證書則出現了錯誤的 ssl 錯誤。所以這行得通。

然後我嘗試將 nginx 作為代理放在 tomcat 前面,但我總是得到 502。Nginx 也在 SSL 上。以下是我得到的錯誤。

2018/04/20 17:25:03 [error] 21884#0: *3 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream, client: 10.6.8.20, server: 10.6.3.105, request: "GET /print HTTP/1.1", upstream: "https://10.6.3.105:8443/", host: "10.6.3.105"

有人可以幫我解決這個問題嗎?最終我只想通過同樣在 SSL 上的 nginx 傳遞 tomcat 證書。( Nginx(https) -> Tomcat(https) )。

我知道這是一個奇怪的要求,但我需要這個。

謝謝,

根據您的評論,聽起來您正在使用客戶端證書進行身份驗證。如果是這樣,您不能使用 Nginx 的 HTTP 代理,而必須使用 Stream 代理。在此處查看文章以獲取更多詳細資訊:

如何在不解密的情況下路由 HTTPS 加密數據包?

在處理客戶端證書時,客戶端證書在 TLS 握手過程中被有效“消耗”,因此如果 Nginx 先接受 SSL 連接,客戶端會將證書送出給 Nginx 進行驗證。由於您的 tomcat 應用程序期望處理客戶端證書以進行身份驗證,因此代理連接沒有可使用的;這將導致 TLS 握手失敗。

使用 Nginx Stream 模組將允許您將流量不間斷地發送(從而保留客戶端證書)到 tomcat 程序,並允許從客戶端證書進行適當的身份驗證。

聽起來您只有一個程序可以使用,因此您不需要 SSL 預讀模組(除非需要負載平衡),您可能只需要以下內容:

stream {
   server {
       listen 443;
       listen [::]:443;

       proxy_pass 127.0.0.1:8443;
   }
}

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