Назад | Перейти на главную страницу

Nginx проверяет сертификаты клиентов только в определенном месте

Мы используем Nginx в качестве обратного прокси для нашего сервера веб-приложений. 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, в конечном итоге предлагают пользователю предоставить сертификат клиента независимо от того, где на веб-сайте они находятся.

Как заставить Nginx принимать, но не заботиться о сертификате клиента везде, кроме нашего? /jsonrpc расположение?

Почему бы не попробовать вторую сервер вместо этого блокировать? Дублирование кода - это плохо, но иногда неизбежно. Я предполагаю, что / 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/;
  }
}