Nginx

Nginx 反向代理通過客戶端證書

  • October 2, 2021

我正在嘗試通過 Nginx 反向代理設置負載均衡器。我的應用程序使用客戶端證書對客戶端進行身份驗證。我希望我的反向代理將客戶端證書轉發到我的後端伺服器。我已將此行添加到反向代理的配置中,以將客戶端證書資訊儲存在自定義 HTTP 標頭中:

proxy_set_header X-SSL-CERT $ssl_client_cert

但是,$ssl_client_cert使用多行來儲存證書,我的後端 nginx 伺服器無法將其正確辨識為一個 HTTP 標頭。實現轉發我的客戶證書的最佳方式是什麼?

這個問題在 2013 年已經在這個論壇上提出過,但到目前為止還沒有真正的解決方案:https ://forum.nginx.org/read.php?2,236546,236546

謝謝!

所以我找到了解決方案。我刪除了證書中的所有換行符,並將它們作為單個 HTTP 標頭從代理髮送到後端,類似於此處所述:

https://forum.nginx.org/read.php?2,236546,236546

在我的後端,我通過每 64 個字元添加一個換行符來重建證書。反向代理的更新程式碼如下,最多可工作 26 行:

map $ssl_client_raw_cert $a {
  "~^(-.*-\n)(?<st>[^\n]+)\n((?<b>[^\n]+)\n)?((?<c>[^\n]+)\n)?((?<d>[^\n]+)\n)?((?<e>[^\n]+)\n)?((?<f>[^\n]+)\n)?((?<g>[^\n]+)\n)?((?<h>[^\n]+)\n)?((?<i>[^\n]+)\n)?((?<j>[^\n]+)\n)?((?<k>[^\n]+)\n)?((?<l>[^\n]+)\n)?((?<m>[^\n]+)\n)?((?<n>[^\n]+)\n)?((?<o>[^\n]+)\n)?((?<p>[^\n]+)\n)?((?<q>[^\n]+)\n)?((?<r>[^\n]+)\n)?((?<s>[^\n]+)\n)?((?<t>[^\n]+)\n)?((?<v>[^\n]+)\n)?((?<u>[^\n]+)\n)?((?<w>[^\n]+)\n)?((?<x>[^\n]+)\n)?((?<y>[^\n]+)\n)?((?<z>[^\n]+)\n)?(-.*-)$" $st;
}

server {
  location / {
     proxy_set_header X-cert $a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$v$u$w$x$y$z;
     proxy_pass http://localhost:8000;
  }
}

(請注意,我已經刪除了以數字開頭的變數)雖然這個解決方案並不理想,但它目前對我有用。另一種解決方案是只發送證書的 DN 資訊,這是一行。目前這對我不起作用,因為我沒有將每個 DN 都儲存在我的數據庫中。

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