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

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

11
задан 10 September 2015 в 22:38
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/;
  }
}
6
ответ дан 2 December 2019 в 21:55

Наткнулся на этот вопрос, когда искал что-то другое.

Возможно, я неправильно понял вопрос:

Но не следует следить за работой.

Два параметра местоположения, но только один параметр сервера.

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 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/;
  }

  location / {
    proxy_pass          http://localhost:8282/;
    proxy_read_timeout  90;
    proxy_redirect      http://localhost/ $scheme://$host:$server_port/;
  }
}
1
ответ дан 30 June 2021 в 00:20

Теги

Похожие вопросы