Nginx verifica i certificati del cliente solo in una posizione particolare


14

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 /jsonrpcma 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 /jsonrpcposizione?

Risposte:


8

Perché non provare invece il secondo blocco server ? La duplicazione del codice è errata ma a volte inevitabile. Presumo / jsonrpc rappresenti un'API in modo che possa utilizzare il proprio sottodominio se non lo utilizza già:

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

Questo è ciò che probabilmente finiremo per fare se non riusciamo a trovare un modo per inserire la giusta configurazione nello stesso serverblocco. Non abbiamo riscontrato lo stesso problema durante l'utilizzo di Apache, quindi speravo che ci fossero delle impostazioni che avrebbero funzionato qui.
Eli Courtwright,

1
@EliCourtwright So che questa domanda era molto tempo fa, ma hai mai trovato una soluzione migliore di due blocchi server?
N Jones,

2
@NJones: purtroppo no, è quello che dovevamo fare.
Eli Courtwright,

Cosa succede se tutto deve rispondere per lo stesso dominio www.esempio.com? Un approccio come questo può ancora funzionare?
Freedom_Ben
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.