Nginxリバースプロキシ経由でロードバランサーを設定しようとしています。私のアプリケーションはクライアント証明書を使用してクライアントを認証します。リバースプロキシでクライアント証明書をバックエンドサーバーに転送したいのですが。この行をリバースプロキシの構成に追加して、クライアント証明書情報をカスタムHTTPヘッダーに格納します。
proxy_set_header X-SSL-CERT $ssl_client_cert
しかしながら、 $ssl_client_cert
は複数行を使用して証明書を保存します。私のバックエンドのnginxサーバーはこれを1つの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情報のみを送信することです。これは1行です。データベースにすべてのDNを保存していないため、現時点ではこれは機能しません。
Nginxの新しいバージョンはすべてを変更するようです\n
から\t
変数$ssl_client_cert
。変数$ssl_client_raw_cert
は、その変換を適用したくない場合に使用できます。
参照: http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables
これは私のために働いたLUAソリューションです:
set_by_lua $client_cert "return ngx.var.ssl_client_raw_cert and ngx.var.ssl_client_raw_cert:gsub('\\n',' ') or nil";
proxy_set_header X-SSL-CERT $client_cert;
また、Ubuntuを使用する場合、nginx-extraにはデフォルトでLUAプラグインがあるため、追加の構成は必要ありません。 https://stackoverflow.com/questions/22193852/running-lua-in-nginx-config =
ここに2つの解決策があります: