Nginx memverifikasi sertifikat klien hanya di lokasi tertentu

14

Kami menggunakan Nginx sebagai proxy terbalik ke server aplikasi web kami. Nginx menangani SSL kami dan yang lainnya berfungsi sebagai proxy terbalik.

Kami ingin meminta sertifikat klien yang valid untuk permintaan /jsonrpctetapi tidak memerlukannya di tempat lain. Cara terbaik yang kami temukan adalah

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

Ini berfungsi dengan baik untuk sebagian besar browser, tetapi beberapa browser seperti Safari dan Chrome-on-Android pada akhirnya mendorong pengguna untuk memberikan sertifikat klien ke mana pun di situs web mereka pergi.

Bagaimana kami membuat Nginx menerima tetapi tidak benar-benar peduli dengan sertifikat klien di mana pun kecuali /jsonrpclokasi kami ?

Eli Courtwright
sumber

Jawaban:

8

Mengapa tidak mencoba blok server kedua saja? Duplikasi kode buruk tetapi terkadang tidak dapat dihindari. Saya berasumsi / jsonrpc mewakili API sehingga dapat menggunakan subdomain sendiri jika belum menggunakannya:

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
sumber
Inilah yang mungkin akan kita lakukan jika kita tidak dapat menemukan cara untuk menempatkan konfigurasi yang tepat di serverblok yang sama . Kami belum memiliki masalah yang sama saat menggunakan Apache, jadi saya berharap ada beberapa pengaturan yang akan berfungsi di sini.
Eli Courtwright
1
@EliCourtwright Saya tahu pertanyaan ini sudah lama sekali, tetapi apakah Anda pernah menemukan solusi yang lebih baik daripada dua blok server?
N Jones
2
@NJones: sayangnya tidak, itulah yang harus kami lakukan.
Eli Courtwright
Bagaimana jika semuanya harus dijawab untuk domain yang sama www.example.com? Bisakah pendekatan seperti ini masih berfungsi?
Freedom_Ben