Cliente de verificação do Nginx somente certificados em um local específico

14

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

Queremos exigir um certificado de cliente válido para solicitações, /jsonrpcmas não 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 no Android, acabam solicitando que o usuário forneça um certificado de cliente, independentemente do local do site.

Como fazemos com que o Nginx aceite, mas realmente não se importe com um certificado de cliente em qualquer lugar, exceto em nossa /jsonrpclocalização?

Eli Courtwright
fonte

Respostas:

8

Por que não tentar o segundo bloco de servidor ? A duplicação de código é ruim, mas às vezes inevitável. Presumo que / jsonrpc represente uma API para que ele possa usar seu próprio subdomínio, se ainda não o usar:

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/;
  }
}
Anatoly
fonte
Provavelmente é isso que faremos se não conseguirmos encontrar uma maneira de colocar a configuração correta no mesmo serverbloco. Não tivemos esse mesmo problema ao usar o Apache, então eu esperava que houvesse alguma configuração que funcionasse aqui.
Eli Courtwright
1
@EliCourtwright Eu sei que essa pergunta foi há muito tempo, mas você já encontrou uma solução melhor que dois blocos de servidor?
N Jones
2
@ Jones: infelizmente não, é o que tínhamos que concordar.
Eli Courtwright
E se tudo tiver que responder pelo mesmo domínio www.example.com? Uma abordagem como essa ainda funciona?
Freedom_Ben