Nginx überprüft Client-Zertifikate nur an einem bestimmten Ort

12

Wir verwenden Nginx als Reverse-Proxy für unseren Webanwendungsserver. Nginx verwaltet unser SSL und dergleichen, fungiert aber ansonsten nur als Reverse-Proxy.

Wir möchten ein gültiges Client-Zertifikat für Anfragen /jsonrpcbenötigen, benötigen diese aber nirgendwo anders. Der beste Weg, den wir gefunden haben, ist zu

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

Dies funktioniert für die meisten Browser einwandfrei, aber einige Browser wie Safari und Chrome-on-Android fordern den Benutzer schließlich auf, ein Client-Zertifikat bereitzustellen, unabhängig davon, wo auf der Website sie sich befinden.

Wie bringen wir Nginx dazu, ein Kundenzertifikat überall außer an unserem /jsonrpcStandort zu akzeptieren, aber nicht wirklich zu interessieren ?

Eli Courtwright
quelle

Antworten:

7

Warum nicht stattdessen den zweiten Serverblock ausprobieren ? Codeduplizierung ist schlecht, aber manchmal unvermeidlich. Ich gehe davon aus, dass / jsonrpc eine API darstellt, sodass es eine eigene Subdomain verwenden kann, wenn es nicht bereits verwendet wird:

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
quelle
Dies ist, was wir wahrscheinlich tun werden, wenn wir nicht herausfinden können, wie wir die richtige Konfiguration alle in einem serverBlock platzieren können. Wir hatten nicht das gleiche Problem bei der Verwendung von Apache, daher hatte ich gehofft, dass hier eine Einstellung funktionieren würde.
Eli Courtwright
1
@EliCourtwright Ich weiß, dass diese Frage schon lange her ist, aber haben Sie jemals eine bessere Lösung als zwei Serverblöcke gefunden?
N Jones
2
@NJones: leider nein, damit mussten wir gehen.
Eli Courtwright