NGINX SSL रिवर्स प्रॉक्सी प्रॉक्सी अपस्ट्रीम SSL सत्यापित करें

Aug 18 2020

मेरे पास केवल एक आईपी पते का उपयोग करके कई वेबसाइटों को होस्ट करने के लिए एनजीआईएनएक्स सेटअप एक रिवर्स प्रॉक्सी के रूप में है। मेरे पास प्रॉक्सी पर एक Lets Encrypt सर्टिफिकेट है और अपस्ट्रीम सर्वर पर एक अलग Lets Encrypt सर्टिफिकेट है। मूल रूप से, मुझे अपस्ट्रीम सर्वर पर ट्रैफ़िक को अग्रेषित करने के लिए NGINX की आवश्यकता है और सत्यापित करें कि अपस्ट्रीम सर्वर के पास वैध TLS प्रमाणपत्र है। यदि मैं अक्षम करता हूं proxy_ssl_verify, तो यह काम करेगा। अगर मैं https://app.local.example.comअपने आंतरिक नेटवर्क पर जाता हूं, तो ऐप ठीक काम करता है।

नेटवर्क आरेख:

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

NGINX रिवर्स प्रॉक्सी कॉन्फ़िगरेशन फ़ाइल:

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

यहाँ त्रुटि संदेश मुझे मिल रहा है।

[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 1.1.1f 31 Mar 2020

नग्नेक्स -v: nginx version: nginx/1.18.0 (Ubuntu)

बिल्ली / आदि / मुद्दा: Ubuntu 20.04.1 LTS \n \l

का आउटपुट 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)

जवाब

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

आपका सर्वर ठीक से कॉन्फ़िगर नहीं है। लीफ सर्टिफिकेट (app.local.example.com) और इंटरमीडिएट सर्टिफिकेट भेजने के बजाय यह केवल लीफ सर्टिफिकेट भेजता है। लापता मध्यवर्ती प्रमाणपत्र के कारण स्थानीय ट्रस्ट एंकर के लिए कोई विश्वास मार्ग नहीं बनाया जा सकता है, जिसका अर्थ है कि प्रमाण पत्र सत्यापन "स्थानीय जारीकर्ता प्रमाण पत्र प्राप्त करने में असमर्थ" के साथ विफल हो जाता है । ब्राउजर अक्सर ऐसी समस्याओं के इर्द-गिर्द कहीं और से इंटरमीडिएट सर्टिफिकेट प्राप्त कर काम करते हैं, लेकिन अन्य टीएलएस स्टैक आमतौर पर ऐसे वर्कअराउंड नहीं करते।

एक बार जब आप सर्वर को ठीक से कॉन्फ़िगर कर लेते हैं, तो आपको निम्नलिखित को देखना चाहिए openssl s_client। एक बार जब यह किया जाता है nginx भी काम करना चाहिए।

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

मैं बदल ssl_certificateसे मूल्य cert.pemको fullchain.pemअपस्ट्रीम सर्वर पर।

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;

यहाँ NGINX विन्यास फाइल का लिंक दिया गया है जिसका मैंने उपयोग किया है