अपस्ट्रीम एसएसएल के साथ रिवर्स प्रॉक्सी के रूप में nginx


20

मैं एक आंतरिक एपीआई के लिए एक प्रॉक्सी का निर्माण कर रहा हूं ताकि ग्राहकों को बिना स्व-हस्ताक्षरित प्रमाणपत्र स्थापित किए बिना कनेक्ट करने की अनुमति मिल सके।

ग्राहक (निर्मित, स्वामित्व और केवल आंतरिक रूप से उपयोग किया जाता है) एसएसएल से नगीनक्स बॉक्स से जुड़ेंगे , जहां मैं आवेदन स्तर (एक रेल एप्लिकेशन) पर क्रेडेंशियल्स को मान्य करने के लिए एक्सएंडएंडइल का उपयोग कर रहा हूं । यदि क्रेडेंशियल मान्य हैं, तो कनेक्शन nginx तक वापस पारित हो जाता है जहां यह अपस्ट्रीम सर्वर पर कनेक्शन भेजने के लिए प्रॉक्सी_पास का उपयोग करता है।

अब यह मानक http कनेक्शन के लिए बहुत अच्छा काम करता है, लेकिन मैं यह पता लगाने की कोशिश कर रहा हूं कि मिश्रण में हमारे प्रमाणपत्र कैसे जोड़े जाएं।

यह सवाल इस एक के लगभग समान है , लेकिन अजीब प्रमाण पत्र आवश्यकताओं के साथ।

क्या यह नगनेक्स के साथ भी संभव है? क्या कोई बेहतर समाधान है?

मैं क्लाइंट से http -> nginx, और स्वयं-हस्ताक्षरित प्रमाणपत्र से nginx से API के लिए भी व्यवस्थित करूँगा।

जवाबों:


19

किसी भी व्यक्ति के लिए यह सवाल है कि nginx का उपयोग करना चाहते हैं, तो आप इसे किसी भी सामान्य प्रॉक्सी की तरह सेट कर सकते हैं, और बैकएंड से स्व-हस्ताक्षरित प्रमाणपत्र स्वीकार करने के लिए आपको निर्यात किए गए पेम प्रमाणपत्र (और शायद एक कुंजी) प्रदान करने की आवश्यकता है और एसएसएल सत्यापन सेट करें बंद। उदाहरण के लिए:

...

server {
    listen       10.1.2.3:80;
    server_name  10.1.2.3 myproxy.mycompany.com;

    location / {
         proxy_pass                    https://backend.server.ip/;
         proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem;
         proxy_ssl_verify              off;

         ... other proxy settings
    }

यदि आपका सिक्योर बैक एंड सर्वर होस्ट आइडेंटिफिकेशन एसएनआई का उपयोग कर रहा है, तो प्रति आईपी / पोर्ट जोड़ी में कई मेजबानों को परोसा जा सकता proxy_ssl_server_name on;है। यह nginx 1.7.0 और बाद में काम करता है।


1
proxy_ssl_server_name on;जब मुझे Google App Engine पर अपने अंतर्निहित Google-प्रबंधित SSL का उपयोग करके ट्रैफ़िक को होस्ट करने के लिए यह काम करने की आवश्यकता थी! (यह एक स्व-हस्ताक्षरित प्रमाणपत्र या कुछ भी नहीं है, इसलिए इसे बस एक पंक्ति की आवश्यकता है)। उत्कृष्ट टिप के लिए धन्यवाद।
XP84

अगर मुझे ssl_certificate का उपयोग नहीं करना है, तो मुझे "सुनो ... ssl" निर्देश के लिए परिभाषित किया गया है कि "नहीं" ssl_certificate है। क्या अपस्ट्रीम सर्टिफिकेट प्रदान किए बिना SSL को प्रॉक्सी करना संभव है?
डेमियन

टिप्पणी विषय से हटकर है क्योंकि यह http के बारे में है जो अपस्ट्रीम https से जुड़ता है। यदि आप https को प्रॉक्सी करना चाहते हैं तो संभवतः इसे एक अलग प्रश्न के रूप में संबोधित किया जाता है। त्वरित और संक्षिप्त उत्तर है नो नग्नेक्स एक प्रमाण पत्र और निजी कुंजी के बिना एक https पोर्ट के लिए "सुन" नहीं सकता है।
shonky linux user

5

मुझे लगता है कि आप शायद ऐसा कुछ चाहते हैं (जाहिर तौर पर इस उदाहरण के लिए सरलीकृत):

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
        server mybackendserver:443;
    }

    server {
        server_name localhost;
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;
        ssl_verify_client off;
        location / {
            proxy_pass  https://backend;
            proxy_set_header Host $http_host;
            proxy_set_header X_FORWARDED_PROTO https;
        }
    }
}

केवल एक चीज जिसे आपको बदलना पड़ सकता है, वह है "होस्ट" को स्पष्ट करने के लिए - यदि, उदाहरण के लिए, आपका अनुमानित होस्ट नाम nginx प्रॉक्सी सर्वर पर उपयोग किए गए होस्ट नाम के समान नहीं था।


मेरी समझ से, ssl_certificate और ssl_certificate_key पैरामीटर क्लाइंट कनेक्शन को संदर्भित करते हैं , अपस्ट्रीम कनेक्शन को नहीं। क्या यह मामला है?
सिमोनमॉडॉक्स

1
मैं जो समझता हूं, हां से। इस उदाहरण में, ग्राहक जिस प्रमाण पत्र को देखता है वह नगीनेक्स द्वारा प्रदान किया गया है। nginx देखता है (और सत्यापित करता है! मुझे यकीन नहीं है ...) सर्वर द्वारा प्रदान किया गया है, लेकिन क्लाइंट के माध्यम से इसे पारित नहीं करता है।
जाम

3

भविष्य में जो भी इसके पार आता है, मैंने इसके लिए नग्नेक्स का उपयोग नहीं किया।

इसके बजाय, मैंने "क्लाइंट मोड" में स्टनेल का उपयोग करके समाप्त कर दिया। स्थापित करने के लिए बहुत आसान है, और मुझे वही चाहिए जो मुझे चाहिए।

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