एक nginx रिवर्स प्रॉक्सी के साथ एन्क्रिप्ट करें


45

परिचय

मेरे पास एक देव सर्वर है (वर्तमान में Ubuntu 14.04 LTS पर चल रहा है), जिसे मैं कुछ समय से विभिन्न बंदरगाहों पर विभिन्न विकास साधनों की मेजबानी के लिए उपयोग कर रहा हूं। क्योंकि बंदरगाहों को याद रखना मुश्किल हो सकता है, मैंने अपनी सभी सेवाओं के लिए पोर्ट 80 का उपयोग करने और होस्टनाम के आधार पर आंतरिक रूप से पोर्ट अग्रेषण करने का निर्णय लिया है।

Domain.com:5432 लिखने के बजाय, मैं बस sub.domain.com के माध्यम से इसे एक्सेस कर सकता हूं

उदाहरण के लिए, अनुप्रयोग X, जो पोर्ट 7547 का उपयोग कर रहा है और sub.domain.com पर चल रहा है, में निम्नलिखित nginx कॉन्फ़िगरेशन है:

upstream sub {
    server 127.0.0.1:7547;
}

server {
    listen 80;
    server_name sub.domain.com www.sub.domain.com;
    access_log /var/log/nginx/sub.log combined;
    location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:7547;
            proxy_set_header Authorization "";
    }
}

प्रश्न

वर्तमान कॉन्फ़िगरेशन संरचना को देखते हुए, जिसे मैंने चुना है, क्या https के तहत letencrypt का उपयोग करना और विभिन्न सेवाओं को चलाना संभव है?


3
मैंने इस विषय पर एक ब्लॉग पोस्ट लिखी थी: tom.busby.ninja/letsecnrypt-nginx-reverse-proxy-no-downtime
टॉम

जवाबों:


81

हां, आपके पास HTTP सर्वरों के लिए nginx प्रॉक्सी अनुरोध हो सकते हैं, और फिर खुद HTTPS पर ग्राहकों को जवाब दे सकते हैं। ऐसा करते समय, आप यह सुनिश्चित करना चाहेंगे कि nginx <-> प्रॉक्सी कनेक्ट होने की संभावना नहीं है जो भी आपका अपेक्षित हमलावर है। सुरक्षित-पर्याप्त दृष्टिकोणों में शामिल हो सकते हैं:

  • एक ही मेजबान के लिए निकटता (जैसा कि आप करते हैं)
  • अपने फ़ायरवॉल के पीछे अन्य मेजबानों के निकट

सार्वजनिक इंटरनेट पर किसी अन्य होस्ट की प्रॉक्सी सुरक्षित-पर्याप्त होने की संभावना नहीं है।

यहाँ उन्हीं वेबसर्वर का उपयोग कर एक लेट्स एनक्रिप्ट सर्टिफिकेट प्राप्त करने के निर्देश हैं जो आप प्रॉक्सी के रूप में उपयोग कर रहे हैं।

लेट्स एनक्रिप्ट से अपने प्रारंभिक प्रमाणपत्र का अनुरोध करना

serverउपनिर्देशिका .well-knownको स्थानीय निर्देशिका से सेवा करने की अनुमति देने के लिए अपना खंड संशोधित करें , जैसे:

server {
    listen 80;
    server_name sub.domain.com www.sub.domain.com;
    […]
    location /.well-known {
            alias /var/www/sub.domain.com/.well-known;
    }

    location / {
        # proxy commands go here
        […]
    }
}

http://sub.domain.com/.well-known वह जगह है जहां चलो एनक्रिप्ट क्रिप्ट्स सर्वर उन चुनौतियों के जवाबों की तलाश करेगा।

इसके बाद आप उपयोग कर सकते हैं certbot का उपयोग कर आइए एन्क्रिप्ट से एक प्रमाणपत्र अनुरोध करने के लिए ग्राहक webroot प्लगइन (रूट के रूप में):

certbot certonly --webroot -w /var/www/sub.domain.com/ -d sub.domain.com -d www.sub.domain.com

अब आपकी की, सर्टिफिकेट और सर्टिफिकेट चेन इनस्टॉल हो जाएगी /etc/letsencrypt/live/sub.domain.com/

अपने प्रमाणपत्र का उपयोग करने के लिए nginx को कॉन्फ़िगर करना

पहले इस तरह एक नया सर्वर क्लॉज बनाएं:

server {
    listen 443 ssl;

    # if you wish, you can use the below line for listen instead
    # which enables HTTP/2
    # requires nginx version >= 1.9.5
    # listen 443 ssl http2;

    server_name sub.domain.com www.sub.domain.com;

    ssl_certificate /etc/letsencrypt/live/sub.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sub.domain.com/privkey.pem;

    # Turn on OCSP stapling as recommended at 
    # https://community.letsencrypt.org/t/integration-guide/13123 
    # requires nginx version >= 1.3.7
    ssl_stapling on;
    ssl_stapling_verify on;

    # Uncomment this line only after testing in browsers,
    # as it commits you to continuing to serve your site over HTTPS
    # in future
    # add_header Strict-Transport-Security "max-age=31536000";

    access_log /var/log/nginx/sub.log combined;

    # maintain the .well-known directory alias for renewals
    location /.well-known {
        alias /var/www/sub.domain.com/.well-known;
    }

    location / {
        # proxy commands go here as in your port 80 configuration
        […]
    }
}

पुन: लोड करें:

service nginx reload

सत्यापित करें कि HTTPS अब जाकर https://sub.domain.comऔर https://www.sub.domain.comआपके ब्राउज़र में काम करता है (और आपके द्वारा विशेष रूप से समर्थन करने की इच्छा रखने वाले किसी भी अन्य ब्राउज़र) और जाँच कर रहा है कि वे प्रमाण पत्र की त्रुटियाँ नहीं हैं।

अनुशंसित: raymii.org की भी समीक्षा करें: nginx पर मजबूत SSL सुरक्षा और SSL Labs पर अपने कॉन्फ़िगरेशन का परीक्षण करें ।

(अनुशंसित) HTTPS के लिए HTTP अप्रत्यक्ष अनुरोध

एक बार जब आप पुष्टि कर लेते हैं कि आपकी साइट https://URL के संस्करण के साथ काम करती है , बजाय इसके कि कुछ उपयोगकर्ता असुरक्षित सामग्री परोसते हैं क्योंकि वे http://sub.domain.comसाइट के HTTPS संस्करण में उन्हें पुनर्निर्देशित करते हैं।

अपने संपूर्ण पोर्ट को 80 serverखंडों से बदलें :

server {
    listen 80;
    server_name sub.domain.com www.sub.domain.com;
    rewrite     ^   https://$host$request_uri? permanent;
}

आपको पोर्ट 443 कॉन्फ़िगरेशन में अब इस लाइन को अनइंस्टॉल करना चाहिए, ताकि ब्राउज़र साइट के HTTP वर्जन को भी न आज़माएँ:

add_header Strict-Transport-Security "max-age=31536000";

अपने प्रमाणपत्र को स्वचालित रूप से नवीनीकृत करें

आप इस प्रमाणपत्र का उपयोग कर सकते हैं (रूट के रूप में) सर्टिफिकेट के लिए जाने वाले सभी प्रमाणपत्रों को नवीनीकृत करने के लिए और नए प्रमाणपत्र का उपयोग करके पुन: लोड करें (जो आपके मौजूदा प्रमाणपत्र के समान पथ होगा):

certbot renew --renew-hook "service nginx reload"

प्रमाण पत्र केवल 60 दिनों से अधिक पुराने प्रमाणपत्रों को नवीनीकृत करने का प्रयास करेगा, इसलिए यह इस आदेश को नियमित रूप से चलाने के लिए सुरक्षित (और अनुशंसित!) है , और यदि संभव हो तो स्वचालित रूप से। उदाहरण के लिए, आप निम्नलिखित कमांड डाल सकते हैं /etc/crontab:

# at 4:47am/pm, renew all Let's Encrypt certificates over 60 days old
47 4,16   * * *   root   certbot renew --quiet --renew-hook "service nginx reload"

आप या तो एक ड्राई-रन के साथ नवीकरण का परीक्षण कर सकते हैं, जो आपके डोमेन से संपर्क करने की वास्तविक परीक्षा करने के लिए स्टेजिंग सर्वरों को एन्क्रिप्ट करने के लिए संपर्क करेगा , लेकिन परिणामी प्रमाणपत्रों को संग्रहीत नहीं करेगा :

certbot --dry-run renew

या आप के साथ एक प्रारंभिक नवीकरण के लिए मजबूर कर सकते हैं:

certbot renew --force-renew --renew-hook "service nginx reload"

नोट: आप जितनी बार चाहें उतनी बार चला सकते हैं, लेकिन वास्तविक नवीनीकरण लेट्स एनक्रिप्ट की सीमा के अधीन हैं


आपका विलेन मेरे लिए काम नहीं करता है। मैं मूल रूप से एक ही विन्यास है। यह goopen.tk के लिए काम करता है, लेकिन www.goopen.tk
Alko

3
@ अलको, उत्तर के निर्देश सही हैं और इस मुद्दे को कवर करते हैं। certbotकिसी अन्य उपकरण का उपयोग करते समय , आप अपने डोमेन को www और गैर-www दोनों प्रारूप में काम करने के लिए निर्दिष्ट करना नहीं भूल सकते हैं।
पाउलो कोगी

के तहत location /.well-known, आप .well-knownरास्ते में छुट्टी की जरूरत है। का प्रयोग करें alias /var/www/sub.domain.com, नहींalias /var/www/sub.domain.com/.well-known
gldraphael

1
क्या कोई मुझे समझा सकता है कि आप "पुनः लिखना ^ https: // $ host $ request_uri? स्थायी?" का उपयोग क्यों करना चाहते हैं यहाँ के बजाय "वापसी 301 https: // $ server_name $ request_uri;"
ZaxLofful

मैंने पाया कि मुझे स्थान में पथ के आसपास उद्धरणों की आवश्यकता थी। location '/.well-known' {। यकीन नहीं होता कि यह एक संस्करण की बात है या सिर्फ मेरा सेटअप है लेकिन मामले में कोई और फंस गया है।
फ्रैंक वी

2

हां, आप nginxhttps के अंतिम बिंदु के रूप में उपयोग कर सकते हैं और http के माध्यम से बैकएंड के साथ सहयोग कर सकते हैं । उदाहरण के लिए मेरा विन्यास:

server {
        server_name host;
        listen 443 ssl;
...
 location /svn/ {
            auth_ldap off;

            proxy_set_header Host $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-Proto $scheme;

            proxy_pass http://localhost:1080/svn/;
            proxy_redirect http://localhost:1080/ https://host/;
        }
...
}

लेकिन जैसा कि मुझे पता है, चलो एन्क्रिप्ट होने पर आपको प्रमाण पत्र मिलने पर सभी उप डोमेन को इंगित करना होगा, और यदि यह एक समस्या है, तो आप https://host/serviceइसके बजाय url चुनते हैंhttps://service.host

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.