Usiamo Nginx come proxy inverso per il nostro server di applicazioni web. Nginx gestisce il nostro SSL e simili ma per il resto funge solo da proxy inverso.
Vogliamo richiedere un certificato client valido per le richieste /jsonrpc
ma non richiederle altrove. Il modo migliore che abbiamo trovato è
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/;
}
}
Questo funziona bene per la maggior parte dei browser, ma alcuni browser come Safari e Chrome-on-Android finiscono per richiedere all'utente di fornire un certificato client indipendentemente da dove si trovino sul sito web.
Come possiamo convincere Nginx ad accettare ma a non preoccuparci davvero di un certificato client ovunque tranne la nostra /jsonrpc
posizione?
server
blocco. Non abbiamo riscontrato lo stesso problema durante l'utilizzo di Apache, quindi speravo che ci fossero delle impostazioni che avrebbero funzionato qui.