SSL istemci sertifikası kimlik doğrulaması ile arka uç için Nginx proxy


14

İki sunucum var, her ikisi de nginx var. Sunucu A 443'ü dinliyor ve İstemci SSL sertifikasıyla kimlik doğrulaması yapacak şekilde yapılandırılmış.

Sunucu B'nin Sunucu A ile nginx aracılığıyla iletişim kurması gereken dahili bir işlemi vardır.

8080 (tüm yerel iletişim olduğundan şifreleme yok) ve ServerA: 443 proxy_pass dinleyecek B sunucusunda Nginx yapılandırmak istiyorum.

Soru, İstemci Sertifikasını nasıl enjekte edebilirim? Bunu yapacak herhangi bir proxy_xxxx işlevi bulamadım.

Ben socat ile buna eşdeğer hale nasıl biliyorum, ama benim gereksinimim nginx kullanmak.


2
Nginx'in proxy modülündeki yönergelere bakıldığında, kimlik doğrulaması için bir sertifika kullanmak için bir nginx sunucusu yapmak mümkün görünmüyor : nginx.org/en/docs/http/ngx_http_proxy_module.html Apache bu özelliği destekliyor.
NuTTyX

Korktuğum şey buydu ... özel bir modül veya bu işi yapabilen bir şey varsa herhangi bir fikir? Bu tür bir özellik olmalı!
Bastien974

Yapılandırma dosyalarını apache'den nginx'e ( github.com/nhnc-nginx/apache2nginx ) geçirmek için bir yardımcı program buldum , bu yüzden indirdim , bir apache.conf oluşturdum ve aracı geçtim, ancak bu sonucu aldım :### Section 2: Unconverted directives ### # Flag Description # [S] Unsupported directives. # In conf file: dummy.conf # Line 32: SSLProxyMachineCertificateFile /path/to/cert (mod_ssl.c) # [S] SSLProxyMachineCertificateFile: No relevant directive in Nginx.
NuTTyX

Yanıtlar:


22

İstemci sertifikası ayrıntılarının iletilmesi yeterli mi?

Ekleyebilirsin

proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;

Sertifika bilgileri B sunucusu tarafından bir X-SSL-Cert üstbilgisi aracılığıyla kullanılabilir.


1
Comented gibi burada arka uç yerine eğer, farkında \tile \nreaded kez bu başlığından.
lucasvc

3
Nginx'in belgelerine göre , $ssl_client_certdeğişken kullanımdan kaldırılmıştır; $ssl_client_escaped_certDeğişken yerine kullanılmalıdır.
dubek

1
@ dubek iyi yakala, böyle durumlarda doğrudan cevabı güncelleyeceğim.
Chris Stryczynski

Bu çözümü deniyorum, ancak sertifika doğrulama AÇIK olarak ayarlanmışsa yalnızca sertifikayı geçiriyor gibi görünüyor. Açmak istemiyorum, doğrulamayı ayarlamadan çalışmasını sağlamanın bir yolu var mı?
juhako

5

Görünüşe göre, aradığınız şey budur: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate 1.7.8 sürümünden beri kullanılabilir.

location / {
    ...
    proxy_pass     the_other_nginx;
    proxy_ssl_certificate  the_certificate.pem;
    ...
}

1
Bu yanlış. Bu, arka uca gelen istekler için kullanılacak proxy'ye bir istemci sertifikası atar. Ancak sordu, bu iletişimin yalnızca yerel olarak şifrelenmediğini, bu nedenle istemci sertifikası kontrolü olmadığını söyledi. Jwilkins'in cevabı iyi çalışıyor.
Kenyakorn Ketsombut

@KenyakornKetsombut Soruyu yanlış okuduğuna inanıyorum. Sunucu B'nin şifrelemesi yoktur (8080'de dinleme) ancak sunucu A ile iletişim kurması gerekir (443'te şifreleme ile dinleme). Bu nedenle B, kimlik doğrulaması için istemci sertifikasını A'ya göndermelidir. Bunu yapmak için proxy_ssl_certificate kullanabilirsiniz. jwilkins cevap, B'ye verilen sertifika A'ya iletecektir. Her ikisi de ihtiyacınıza bağlı olarak çalışabilir.
Nicolas Malbran

Merhaba Nicolas. Söylemeye çalışıyordum: Sunucu B şifreleme kullanmıyorsa (port 8080'de) HTTPS / SSL gibi bir şey kullanmaz veya siz çağırırsınız. İstemci sertifikaları SSL'nin bir parçasıdır, bu nedenle bu bölüm Sunucu B tarafından yapılamaz. B herhangi bir istemci sertifikası gönderemez veya alamaz.
Kenyakorn Ketsombut

1
Ben nginx olsun: [emerg] hayır "proxy_ssl_certificate_key" sertifika için tanımlanan "certs / Roro_Client.pem" nginx: Ben 1.8.0 ile bu çalıştığınızda yapılandırma dosyası /etc/nginx/nginx.conf testi başarısız
Wolfgang Fahl

4

Sorun büyük ölçüde versiyona bağlı gibi görünüyor. Ubuntu 14.04 LTS'de varsayılan nginx eski bir 1.4'tür. Öncelikle PPA tabanlı bir sürüm yüklemeniz gerekir

https://leftshift.io/upgrading-nginx-to-the-latest-version-on-ubuntu-servers

bunun nasıl yapılacağını gösterir:

sudo add-apt-repository ppa:nginx/stable
sudo aptitude safe-upgrade

Sonuç olarak:

nginx -v
nginx version: nginx/1.8.0

@ Xatr0z adresindeki yapılandırma https://serverfault.com/a/636455/162693 http://www.senginx.org/en/index.php/Proxy_HTTPS_Client_Certificate 'yi işaret eden yapılandırma çalışmıyor:

çalışmayan teklif

backend {
    server some-ip:443;
}

server {
    listen 80;


    location / {
        proxy_ssl_certificate        certs/client.crt;
        proxy_ssl_certificate_key    certs/client.key;


        proxy_pass https://backend;
    }
}

1.8.0 ile kutudan çıkmaz. Muhtemelen sadece ipucu amaçlıdır ve bu şekilde bir yapılandırma dosyası olarak kullanılmamalıdır veya başka bir sürüme bağlıdır.

SSL ve kendinden imzalı istemci sertifikaları etkinleştirilmiş bir apache2 tabanlı arka uç sunucusu A ile test yapıyorum. Apache yapılandırma SSLOptions şu şekilde ayarlanır:

SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars

Arka uç tarafındaki bir phpinfo () betiği Sunucu ve İstemci Tarafı bilgilerini göstereceğinden, bu durum hata ayıklamayı kolaylaştırır.

Bunu doğrulamak için kullandım:

https: // arka uç / test / phpinfo

SSL sertifikası tarayıcıya yüklendiğinde ve sunucu sertifikası için SSL_SERVER_S_DN_CN ve istemci sertifikası için SSL_CLIENT_S_DN_CN gibi bölümler alıyorum.

İlk başlangıç ​​olarak ön uç sunucu B'deki nginx'i yapılandırmak için kullandım (parçaları parantez içinde doldurun):

server {
  listen 8080;
  server_name <frontend>;

  location / {
    proxy_buffering off;
    proxy_pass https://<backend>;
    #proxy_ssl_certificate      certs/<SSL Client Certificate>.crt;
    #proxy_ssl_certificate_key  certs/<SSL Client Certificate>.key;
  }
}

sadece ters proxy'nin çalışıp çalışmadığını kontrol etmek için SSL İstemci Sertifikasına özgü parçanın kaplamasının kaldırılması.

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931

Şimdi http: // frontend: 8080 / test / phpinfo.php çalışıyor

Sunucu sertifikası için SSL_SERVER_S_DN_CN görüntülenir ve istemci sertifikası için SSL_CLIENT_S_DN_CN (henüz) görüntülenmez

Şimdi uncommenting sonra:

server {
  listen 8080;
  server_name <frontend>;

  location / {
    proxy_buffering off;
    proxy_pass https://<backend>;
    proxy_ssl_certificate      certs/<SSL Client Certificate>.crt;
    proxy_ssl_certificate_key  certs/<SSL Client Certificate>.key;
  }
}

ve kontrol etme / yeniden başlatma

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
service nginx restart
nginx stop/waiting
nginx start/running, process 8931

http: // ön uç: 8080 / test / phpinfo.php çalışır ve

Sunucu sertifikası için SSL_SERVER_S_DN_CN görüntülenir ve istemci sertifikası için SSL_CLIENT_S_DN_CN görüntülenir

şimdi istediğimiz gibi işlerimiz var.

Lütfen hataya dikkat edin https://trac.nginx.org/nginx/ticket/872#ticket


Sen yeniden müzakere konu için dikkat isteyebilirsiniz ruby-forum.com/topic/6875137 gösterisi bozabileceğinden
Wolfgang fahl

1

Nginx ve SSL istemci sertifikaları hakkında oldukça düzgün bir makale var; Örnek olarak FastCGI ile PHP kullanıyor ancak bunun ters proxy kurulumuna uyarlanabileceğini düşünüyorum:

server {
    listen        443;
    ssl on;
    server_name example.com;

    ssl_certificate      /etc/nginx/certs/server.crt;
    ssl_certificate_key  /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
    ssl_verify_client optional;

    location / {
        root           /var/www/example.com/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME /var/www/example.com/lib/Request.class.php;
        fastcgi_param  VERIFIED $ssl_client_verify;
        fastcgi_param  DN $ssl_client_s_dn;
        include        fastcgi_params;
    }
}

Kaynak http://nategood.com/client-side-certificate-authentication-in-ngi

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.