web-dev-qa-db-ja.com

特定の場所でのみクライアント証明書を検証するNginx

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の場所を除くすべての場所でクライアント証明書を気にしませんか?

14
Eli Courtwright

代わりに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/;
  }
}
8
Anatoly