NginxをWebアプリケーションサーバーへのリバースプロキシとして使用します。 NginxはSSLなどを処理しますが、それ以外はリバースプロキシとして機能します。
/jsonrpc
へのリクエストには有効なクライアント証明書が必要ですが、他の場所では必要ありません。私たちが見つけた最良の方法は
server {
listen *:443 ssl;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_client_certificate /etc/nginx/client-ca.crt;
ssl_verify_client optional;
location /jsonrpc {
if ($ssl_client_verify != "SUCCESS") { return 403; }
proxy_pass http://localhost:8282/jsonrpc-api;
proxy_read_timeout 90;
proxy_redirect http://localhost/ $scheme://$Host:$server_port/;
}
}
これはほとんどのブラウザーで正常に機能しますが、SafariやChrome-on-Androidなどの一部のブラウザーは、ユーザーがWebサイトのどこにアクセスしても、クライアント証明書を提供するように求めます。
Nginxをどのように受け入れますが、/jsonrpc
の場所を除くすべての場所でクライアント証明書を気にしませんか?
代わりに2番目のserverブロックを試してみませんか?コードの重複は悪いですが、避けられないことがあります。/jsonrpcはAPIを表すので、まだ使用していない場合は独自のサブドメインを使用できます。
server {
listen *:443 ssl;
server_name api.example.com;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_client_certificate /etc/nginx/client-ca.crt;
ssl_verify_client on;
location =/jsonrpc {
proxy_pass http://localhost:8282/jsonrpc-api;
proxy_read_timeout 90;
proxy_redirect http://localhost/ $scheme://$Host:$server_port/;
}
}
server {
listen *:443 ssl;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_client_certificate /etc/nginx/client-ca.crt;
ssl_verify_client off;
location / {
proxy_pass http://localhost:8282/;
proxy_read_timeout 90;
proxy_redirect http://localhost/ $scheme://$Host:$server_port/;
}
}