Nginx перевіряє клієнтські сертифікати лише в певному місці


14

Ми використовуємо 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місця розташування?

Відповіді:


8

Чому б не спробувати другий блок сервера замість цього? Дублювання коду є поганим, але іноді неминучим. Я припускаю, що / 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, тому я сподівався, що тут буде якась настройка, яка працюватиме.
Eli Courtwright

1
@EliCourtwright Я знаю, що це питання було давно, але ви коли-небудь знаходили рішення краще, ніж два серверні блоки?
N Jones

2
@NJones: на жаль, ні, саме з цим нам довелося йти.
Eli Courtwright

Що робити, якщо все повинно відповідати для одного домену www.example.com? Чи може такий підхід все-таки спрацювати?
Freedom_Ben
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.