Usamos Nginx como proxy inverso de nuestro servidor de aplicaciones web. Nginx maneja nuestro SSL y tal, pero por lo demás solo actúa como un proxy inverso.
Queremos exigir un certificado de cliente válido para solicitudes, /jsonrpc
pero no exigirlas en ningún otro lugar. La mejor manera que hemos encontrado es
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/;
}
}
Esto funciona bien para la mayoría de los navegadores, pero algunos navegadores como Safari y Chrome-on-Android terminan incitando al usuario a proporcionar un certificado de cliente sin importar en qué lugar del sitio web vayan.
¿Cómo hacemos para que Nginx acepte pero no realmente se preocupe por un certificado de cliente en todas partes excepto en nuestra /jsonrpc
ubicación?
server
bloque. No hemos tenido este mismo problema al usar Apache, por lo que esperaba que hubiera alguna configuración que funcionara aquí.