Nginx verificar os certificados do cliente somente em um local específico

10

Usamos o Nginx como um proxy reverso para o nosso servidor de aplicativos da web. O Nginx lida com nosso SSL e tal, mas de outra forma apenas age como um proxy reverso.

Queremos exigir um certificado de cliente válido para solicitações de /jsonrpc , mas não as exigimos em nenhum outro lugar. A melhor maneira que encontramos é

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/;
  }
}

Isso funciona bem para a maioria dos navegadores, mas alguns navegadores, como o Safari e o Chrome-on-Android, acabam solicitando que o usuário forneça um certificado de cliente, independentemente da localização do site.

Como podemos aceitar o Nginx, mas não nos importamos realmente com um certificado de cliente em todos os lugares, exceto nosso /jsonrpc location?

    
por Eli Courtwright 10.09.2015 / 21:38

1 resposta

6

Por que não tentar o segundo bloco servidor ? Duplicação de código é ruim, mas às vezes inevitável. Eu assumo que / jsonrpc representa uma API para que ele possa usar seu próprio subdomínio se ainda não usá-lo:

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/;
  }
}
    
por 11.09.2015 / 10:21