Question Nginx vérifiant les certs client uniquement sur un emplacement particulier


Nous utilisons Nginx en tant que proxy inverse sur notre serveur d'applications Web. Nginx gère notre SSL et autres, mais agit simplement comme un proxy inverse.

Nous voulons exiger un certificat client valide pour les demandes de /jsonrpc mais ne les exige pas ailleurs. Le meilleur moyen que nous avons trouvé est de

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

Cela fonctionne bien pour la plupart des navigateurs, mais certains navigateurs tels que Safari et Chrome-sur-Android finissent par demander à l'utilisateur de fournir un certificat client, peu importe où il se trouve sur le site Web.

Comment pouvons-nous convaincre Nginx d’accepter un certificat client partout dans le monde, sauf notre /jsonrpc emplacement?


8
2017-09-10 19:38


origine




Réponses:


Pourquoi ne pas essayer en second serveur bloquer à la place? La duplication de code est mauvaise mais parfois inévitable. Je suppose que / jsonrpc représente une API et qu'il peut utiliser son propre sous-domaine s'il ne l'utilise pas déjà:

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

6
2017-09-11 08:21



C’est ce que nous finirons probablement par faire si nous ne pouvons pas trouver un moyen de mettre la bonne configuration dans le même état. server bloc. Nous n’avons pas eu le même problème avec Apache, alors j’espérais que certains paramètres fonctionneraient ici. - Eli Courtwright
@EliCourtwright Je sais que cette question remonte à longtemps, mais avez-vous déjà trouvé une solution meilleure que deux blocs de serveur? - N Jones
@NJones: malheureusement non, c'est ce que nous avons dû faire. - Eli Courtwright