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


13

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場所以外のすべての場所でクライアント証明書を受け入れますが、実際には気にしないようにするにはどうすればよいですか?

回答:


7

代わりに2番目のサーバーブロックを試さないのはなぜですか?コードの複製は悪いですが、時には避けられないことがあります。/ 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/;
  }
}

これは、正しい構成をすべて同じserverブロックに配置する方法が分からない場合に、おそらく最終的に実行されることです。Apacheを使用しているときにこの問題は発生していなかったので、ここで機能する設定があればいいと思いました。
イーライコートライト

1
@EliCourtwrightこの質問はかなり前のことですが、2つのサーバーブロックよりも優れたソリューションを見つけたことがありますか?
N・ジョーンズ

2
@NJones:残念ながらいいえ、それは私たちが行かなければならなかったことです。
エリコートライト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.