Мы используем 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/;
}
}