NGINX SSL Ters Proxy Yukarı Akış SSL'yi Doğrulayın

Aug 18 2020

Yalnızca bir IP adresi kullanarak birden çok web sitesini barındırmak için ters proxy olarak NGINX kurulumuna sahibim. Proxy üzerinde bir Lets Encrypt sertifikam ve yukarı akış sunucusunda farklı bir Lets Encrypt sertifikam var. Temel olarak, trafiği yukarı akış sunucusuna iletmek ve yukarı akış sunucusunun geçerli bir TLS sertifikasına sahip olduğunu doğrulamak için NGINX'e ihtiyacım var. Devre dışı bırakırsam proxy_ssl_verifyişe yarayacak. https://app.local.example.comDahili ağıma gidersem , uygulama iyi çalışıyor.

Ağ Şeması:

https://app.example.com --> NGINX Reverse Proxy --> https://app.local.example.com (Local IP Address)

NGINX Ters Proxy Yapılandırma Dosyası:

server {
    listen 80;
    rewrite ^ https://$host$request_uri? permanent;
}

server {
        server_name app.example.com;

        listen                                  443 ssl;

        ssl_certificate                         /etc/letsencrypt/live/app.example.com/cert.pem;
        ssl_certificate_key                     /etc/letsencrypt/live/app.example.com/privkey.pem;
        ssl_trusted_certificate                 /etc/letsencrypt/live/app.example.com/chain.pem;

        location / {

                proxy_redirect off;
                proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Ssl on; proxy_set_header X-Forwarded-Protocol $scheme;
                proxy_set_header X-Forwarded-HTTPS on;

                proxy_ssl_session_reuse        off;
                proxy_ssl_name                 app.local.example.com

                proxy_ssl_verify               on;
                proxy_ssl_verify_depth         2; # I've tried 1,2,3,4
                proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; 
                            
                proxy_pass                     https://app.local.example.com
        }
}

İşte aldığım hata mesajı.

[error] 1087#1087: *2 upstream SSL certificate verify error: (20:unable to get local issuer certificate) while SSL handshaking to upstream, client: [Client IP], server: app.example.com, request: "GET / HTTP/1.1", upstream: "https://192.168.1.5:443/", host: "app.local.example.com", referrer: "https://app.example.com/">

OpenSSL Sürümü: OpenSSL 1.1.1f 31 Mar 2020

nginx -v: nginx version: nginx/1.18.0 (Ubuntu)

cat / etc / issue: Ubuntu 20.04.1 LTS \n \l

Çıktı openssl s_client -connect app.local.example.com:443

CONNECTED(00000003)
depth=0 CN = app.local.example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = app.local.example.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:CN = app.local.example.com
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFeDCCBGCgAwIBAgISA8NkbZ6wz2EnKcedXujKT9AmMA0GCSqGSIb3DQEBCwUA
...
-----END CERTIFICATE-----
...
SSL-Session:
    Protocol  : TLSv1.3
    ...
    Verify return code: 21 (unable to verify the first certificate)

Yanıtlar

2 SteffenUllrich Aug 18 2020 at 02:42
Certificate chain
 0 s:CN = app.local.example.com
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

Sunucunuz doğru şekilde yapılandırılmamış. Yaprak sertifika (app.local.example.com) ve ara sertifika göndermek yerine yalnızca yaprak sertifikayı gönderir. Eksik ara sertifika nedeniyle, yerel güven bağlantısına giden bir güven yolu oluşturulamaz, bu da sertifika doğrulamasının "yerel yayıncı sertifikası alınamıyor " ile başarısız olduğu anlamına gelir . Tarayıcılar genellikle eksik ara sertifikayı başka bir yerden alarak bu tür sorunların üstesinden gelir, ancak diğer TLS yığınları genellikle bu tür geçici çözümler yapmaz.

Sunucuyu doğru bir şekilde yapılandırdıktan sonra, aşağıdakileri görmelisiniz openssl s_client. Bu yapıldıktan sonra nginx de çalışmalıdır.

Certificate chain
 0 s:CN = app.local.example.com
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
MarcWoodyard Aug 18 2020 at 13:17

Değiştim ssl_certificatedeğeri cert.pemiçin fullchain.pemyukarı sunucuda.

ssl_certificate         /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key     /etc/letsencrypt/live/app.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/app.example.com/chain.pem;

İşte kullandığım NGINX yapılandırma dosyalarına bir bağlantı