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