私には2台のサーバーがあり、どちらにもnginxがあります。サーバーAは443をリッスンしており、クライアントSSL証明書で認証するように構成されています。
サーバーBには、nginxを介してサーバーAと通信する必要がある内部プロセスがあります。
8080(すべてローカル通信であるため暗号化なし)をリッスンし、ServerA:443にproxy_passするサーバーBにNginxを構成したいと思います。
問題は、クライアント証明書をどのように注入するかです。私はそれを実行するproxy_xxxx関数を見つけられませんでした。
私はsocatでそれと同等のものを作成する方法を知っていますが、私の要件はnginxを使用することです。
クライアント証明書の詳細を渡すだけで十分ですか?
あなたは付け加えられます
proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
構成に追加すると、サーバーBはX-SSL-Certヘッダーを介して証明書情報を利用できます。
どうやら、これはあなたが探しているものです: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate バージョン1.7.8以降で使用可能です。
location / {
...
proxy_pass the_other_nginx;
proxy_ssl_certificate the_certificate.pem;
...
}
問題は主にバージョンに依存するようです。 Ubuntu 14.04 LTSでは、デフォルトのnginxは古い1.4です。まず、PPAベースのバージョンをインストールする必要があります
https://leftshift.io/upgrading-nginx-to-the-latest-version-on-ubuntu-servers
これを行う方法を示します:
Sudo add-apt-repository ppa:nginx/stable
Sudo aptitude safe-upgrade
あなたは次のようになるはずです:
nginx -v
nginx version: nginx/1.8.0
@ xatr0z回答の設定 https://serverfault.com/a/636455/16269 が指す http://www.senginx.org/en/index.php/Proxy_HTTPS_Client_Certificate 機能しません:
非稼働提案
backend {
server some-ip:443;
}
server {
listen 80;
location / {
proxy_ssl_certificate certs/client.crt;
proxy_ssl_certificate_key certs/client.key;
proxy_pass https://backend;
}
}
1.8.0では、そのままでは機能しません。これはおそらくヒントとしてのみ意図されており、そのような設定ファイルとして使用したり、別のバージョンに依存することはありません。
SSLと自己署名クライアント証明書を有効にしたApache2ベースのバックエンドサーバーAでテストしています。 Apache config SSLOptionsは次のように設定されています。
SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars
これにより、バックエンド側のphpinfo()スクリプトがサーバー側とクライアント側の情報を表示するため、状況のデバッグが容易になります。
これを確認するには、私は使用しました:
ブラウザにSSL証明書がインストールされていて、サーバー証明書のSSL_SERVER_S_DN_CNとクライアント証明書のSSL_CLIENT_S_DN_CNのようなセクションが表示されます。
最初のスタートとして、フロントエンドサーバーBでnginxを構成するために使用しました(括弧内の部分を埋めます)。
server {
listen 8080;
server_name <frontend>;
location / {
proxy_buffering off;
proxy_pass https://<backend>;
#proxy_ssl_certificate certs/<SSL Client Certificate>.crt;
#proxy_ssl_certificate_key certs/<SSL Client Certificate>.key;
}
}
sSLクライアント証明書固有の部分のコメントを外して、リバースプロキシ自体が機能することを確認します。
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931
今 http:// frontend:8080/test/phpinfo.php は機能します
サーバー証明書のSSL_SERVER_S_DN_CNが表示され、クライアント証明書のSSL_CLIENT_S_DN_CNは(まだ)表示されていません
コメントを外した後:
server {
listen 8080;
server_name <frontend>;
location / {
proxy_buffering off;
proxy_pass https://<backend>;
proxy_ssl_certificate certs/<SSL Client Certificate>.crt;
proxy_ssl_certificate_key certs/<SSL Client Certificate>.key;
}
}
およびチェック/再起動
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931
http:// frontend:8080/test/phpinfo.php 機能し、
サーバー証明書のSSL_SERVER_S_DN_CNが表示され、クライアント証明書のSSL_CLIENT_S_DN_CNが表示されます
これで、要求どおりに機能するようになりました。
バグに注意してください https://trac.nginx.org/nginx/ticket/872#ticket
NginxとSSLクライアント証明書に関するすばらしい記事があります。 PHPを例としてFastCGIを使用していますが、これをリバースプロキシ設定に適応させることができると思います。
server {
listen 443;
ssl on;
server_name example.com;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client optional;
location / {
root /var/www/example.com/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/example.com/lib/Request.class.php;
fastcgi_param VERIFIED $ssl_client_verify;
fastcgi_param DN $ssl_client_s_dn;
include fastcgi_params;
}
}
ソース http://nategood.com/client-side-certificate-authentication-in-ngi
このSEnginxモジュールはあなたが探しているもののようです: http://www.senginx.org/en/index.php/Proxy_HTTPS_Client_Certificate