Nginx istemci sertifikalarını yalnızca belirli bir konumda doğrular


14

Nginx'i web uygulama sunucumuzun ters proxy'si olarak kullanıyoruz. Nginx SSL'imizi ve benzerlerini işler, ancak aksi takdirde ters proxy olarak işlev görür.

İstekler için geçerli bir müşteri sertifikası talep etmek istiyoruz, /jsonrpcancak başka bir yerde talep etmiyoruz. Bulduğumuz en iyi yol

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

Bu, çoğu tarayıcı için iyi çalışır, ancak Safari ve Android'de Chrome gibi bazı tarayıcılar, kullanıcının web sitesinde nereye giderse gitsinler bir istemci sertifikası sağlamasını ister.

Nginx'in konumum dışında her yerde bir müşteri sertifikasını kabul etmesini ancak gerçekten umursamamasını nasıl sağlarız /jsonrpc?

Yanıtlar:


8

Bunun yerine neden ikinci sunucu bloğunu denemiyorsunuz ? Kod çoğaltma kötüdür ancak bazen kaçınılmazdır. / Jsonrpc, zaten kullanmıyorsa kendi alt alan adını kullanabilmesi için bir API'yi temsil ettiğini varsayıyorum:

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

Doğru yapılandırmayı aynı serverbloğa koymak için bir yol bulamazsak, muhtemelen bunu yapacağız . Apache'yi kullanırken aynı sorunu yaşamadık, bu yüzden burada çalışacak bazı ayarların olmasını umuyordum.
Eli Courtwright

1
@EliCourtwright Bu sorunun uzun zaman önce olduğunu biliyorum, ancak iki sunucu bloğundan daha iyi bir çözüm buldunuz mu?
N Jones

2
@NJones: ne yazık ki hayır, bununla gitmek zorunda kaldık.
Eli Courtwright

Aynı alan www.example.com için her şeyin yanıt vermesi gerekiyorsa ne olur? Böyle bir yaklaşım hala işe yarayabilir mi?
Freedom_Ben
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.