Używamy Nginx jako odwrotnego proxy do naszego serwera aplikacji WWW. Nginx obsługuje nasz protokół SSL, ale w przeciwnym razie działa tylko jako odwrotny serwer proxy.
Chcemy wymagać ważnego certyfikatu klienta dla żądań, /jsonrpc
ale nie wymagamy ich nigdzie indziej. Najlepszym sposobem, jaki znaleźliśmy, jest
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/;
}
}
Działa to dobrze w przypadku większości przeglądarek, ale niektóre przeglądarki, takie jak Safari i Chrome na Androida, ostatecznie wyświetlają monit o podanie certyfikatu klienta bez względu na to, w której witrynie się znajdują.
Jak sprawić, by Nginx akceptował certyfikat klienta, ale nie dbał o to wszędzie, z wyjątkiem naszej /jsonrpc
lokalizacji?
server
bloku. Nie mieliśmy tego samego problemu podczas używania Apache, więc miałem nadzieję, że będzie jakieś ustawienie, które będzie działać tutaj.