एसएसएल क्लाइंट सर्टिफिकेशन ऑथेंटिकेशन के साथ नगनेक्स प्रॉक्सी टू बैक-एंड


14

मेरे पास दो सर्वर हैं, दोनों में nginx है। सर्वर ए 443 को सुन रहा है और क्लाइंट एसएसएल प्रमाणपत्र के साथ प्रमाणित करने के लिए कॉन्फ़िगर किया गया है।

सर्वर B में एक आंतरिक प्रक्रिया होती है, जिसे nginx के माध्यम से सर्वर A को संप्रेषित करने की आवश्यकता होती है।

मैं सर्वर बी पर नंगेक्स को कॉन्फ़िगर करना चाहूंगा जो कि 8080 (कोई एन्क्रिप्शन नहीं होगा, क्योंकि यह सभी स्थानीय संचार है) और प्रॉक्सी_पास टू सर्वरए: 443।

सवाल यह है कि मैं ग्राहक प्रमाणपत्र कैसे इंजेक्ट कर सकता हूं? मुझे ऐसा कोई भी प्रॉक्सी_xxxx फंक्शन नहीं मिला जो ऐसा करता हो।

मुझे पता है कि समाज के साथ एक समतुल्य कैसे बनाना है, लेकिन मेरी आवश्यकता नगीनेक्स का उपयोग करना है।


2
Nginx के प्रॉक्सी मॉड्यूल में निर्देशों को देखते हुए, ऐसा लगता है कि प्रमाणित करने के लिए किसी प्रमाणपत्र का उपयोग करने के लिए nginx सर्वर बनाना संभव नहीं है: nginx.org/en/docs/http/ngx_http-proxy_module.html Apache उस सुविधा का समर्थन करता है, हालाँकि।
NuTTyX

यही कारण है कि मैं डर गया था ... किसी भी विचार अगर वहाँ एक कस्टम मॉड्यूल या कुछ है जो यह काम कर सकता है? उस तरह की सुविधा मौजूद है!
बस्तिन

मुझे अपाचे से nginx ( github.com/nhnc-nginx/apache2nginx ) में कॉन्फ़िगर फ़ाइलों को माइग्रेट करने की एक उपयोगिता मिली है , इसलिए मैंने इसे डाउनलोड किया, एक डमी Apache.conf बनाया और इसे टूल के माध्यम से पास किया, लेकिन मुझे यह परिणाम मिल गया है :### 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

जवाबों:


21

क्या क्लाइंट सर्टिफिकेट विवरण पास होना पर्याप्त है?

आप जोड़ सकते हो

proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;

आपके कॉन्फिगरेशन और फिर सर्टिफिकेट की जानकारी सर्वर बी को एक्स-एसएसएल-सर्टिफिकेट हेडर के जरिए उपलब्ध है।


1
के रूप में comented यहाँ , अगर अपने बैकएंड की जगह ले सकता बारे में पता होना \tके साथ \nएक बार readed इस हैडर से।
ल्यूकसिव

3
नेगनेक्स के दस्तावेज के अनुसार , $ssl_client_certचर को पदावनत किया जाता है; $ssl_client_escaped_certचर के बजाय इस्तेमाल किया जाना चाहिए।
डबेक

1
@ डबेक अच्छी पकड़, मैं इस तरह के मामलों में सीधे जवाब अपडेट करूंगा।
क्रिस स्ट्रीकजेनस्की

मैं इस समाधान की कोशिश कर रहा था, लेकिन यह केवल प्रमाण पत्र सत्यापन के माध्यम से चालू होने पर ही प्रमाण पत्र को पारित करने के लिए लगता है। मैं इसे चालू नहीं करना चाहता, क्या इस पर सत्यापन स्थापित किए बिना इसे काम करने का एक तरीका है?
जुहाको १६'१

5

जाहिरा तौर पर, यह वही है जो आप ढूंढ रहे हैं: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate संस्करण 1.7.8 के बाद से उपलब्ध है।

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

1
ये गलत है। यह बैकएंड के अनुरोधों के लिए उपयोग किए जाने वाले प्रॉक्सी को एक क्लाइंट सर्टिफिकेट प्रदान करता है। लेकिन यह पूछे जाने पर कि इस संचार को केवल एक स्थानीय नाम से जाना जाता है, इसलिए ग्राहक प्रमाणपत्र की जाँच नहीं होती है। Jwilkins का जवाब अच्छा काम करता है।
केनाकोर्न केटसॉम्बट

@KenyakornKetsombut मेरा मानना ​​है कि आप प्रश्न को गलत समझते हैं। सर्वर B का कोई एन्क्रिप्शन नहीं है (8080 पर सुन रहा है) लेकिन सर्वर A (443 पर सुनना, एन्क्रिप्शन के साथ) से संवाद करना है। तो B को प्रमाणित करने के लिए A को क्लाइंट सर्टिफिकेट भेजने की आवश्यकता है। इसे पूरा करने के लिए आप प्रॉक्सी_एसएसएल_ सर्टिफिकेट का उपयोग कर सकते हैं। jwilkins का जवाब, A को B को दिया गया सर्टिफिकेट होगा। दोनों को आपकी जरूरत के आधार पर काम करना चाहिए।
निकोलस मालबर्न

हाय निकोलस। मैं यह कहना चाह रहा था: यदि सर्वर बी एन्क्रिप्शन (पोर्ट 8080 पर) का उपयोग नहीं कर रहा है, तो वह एचटीटीपीएस / एसएसएल जैसी किसी भी चीज का उपयोग नहीं करता है या फिर भी आप इसे कॉल करते हैं। क्लाइंट सर्टिफिकेट एसएसएल का एक हिस्सा है, इसलिए यह हिस्सा सर्वर बी द्वारा नहीं किया जा सकता है। बी कोई क्लाइंट सर्टिफिकेट नहीं भेज या प्राप्त कर सकता है।
केनाकोर्न केटसॉम्बट

1
मुझे nginx मिलता है: [emerg] कोई "छद्म_सीएल_ सर्टिफिकेट_की" प्रमाणपत्र के लिए परिभाषित नहीं किया गया है "certs / Roro_Client.pem" nginx: कॉन्फ़िगरेशन फ़ाइल /etc/nginx/nginx.conf परीक्षण विफल हुआ जब मैं 1.8.0 के साथ यह कोशिश करता हूं
वोल्फगैंग

4

यह मुद्दा काफी हद तक संस्करण पर निर्भर करता है। उबंटू 14.04 एलटीएस पर डिफ़ॉल्ट नगनेक्स एक पुराना 1.4 है। सबसे पहले आपको पीपीए आधारित संस्करण स्थापित करने की आवश्यकता है

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

दिखाता है कि यह कैसे करना है:

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

आपको समाप्त होना चाहिए:

nginx -v
nginx version: nginx/1.8.0

@ Xatr0z जवाब से विन्यास https://serverfault.com/a/636455/162693 की ओर इशारा करते http://www.senginx.org/en/index.php/Proxy_HTTPS_Client_Certificate नहीं काम करता है:

गैर-कार्य प्रस्ताव

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 के साथ बॉक्स से बाहर काम नहीं करता है। यह शायद केवल एक संकेत के रूप में होता है और इसे कॉन्फ़िगरेशन फ़ाइल के रूप में उपयोग नहीं किया जाता है या किसी अन्य संस्करण पर निर्भर करता है।

मैं एक अपाचे 2 आधारित बैकएंड सर्वर ए के साथ एसएसएल और स्व-हस्ताक्षरित क्लाइंट प्रमाण पत्र सक्षम कर रहा हूं। अपाचे कॉन्फिगर एसएसएल्यूएशन निम्न पर सेट हैं:

SSLOptions +ExportCertData +FakeBasicAuth + StdEnvVars

यह स्थिति को डीबग करना आसान बनाता है क्योंकि बैकएंड साइड पर एक phpinfo () स्क्रिप्ट सर्वर और क्लाइंट साइड जानकारी दिखाएगा।

यह सत्यापित करने के लिए मैंने प्रयोग किया है:

https: // बैकएंड / परीक्षण / phpinfo

ब्राउज़र में स्थापित एसएसएल प्रमाणपत्र के साथ और मुझे इस तरह के अनुभाग मिलते हैं: क्लाइंट प्रमाण पत्र के लिए सर्वर प्रमाणपत्र के लिए एसएसएल_सर्वर_एस_एनडीएनसी और क्लाइंट प्रमाण पत्र के लिए SSL_CLIENT_S_DN_CN।

एक पहली शुरुआत के रूप में मैंने उपयोग किया (कोष्ठक में भागों को भरने के लिए) दृश्यपटल सर्वर B पर nginx को कॉन्फ़िगर करने के लिए:

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

एसएसएल क्लाइंट सर्टिफिकेट विशिष्ट भाग को केवल यह जांचने के लिए कि रिवर्स प्रॉक्सी स्वयं काम करता है।

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: // frontend: 8080 / test / phpinfo.php काम करता है

सर्वर प्रमाणपत्र के लिए SSL_SERVER_S_DN_CN प्रदर्शित होता है और क्लाइंट प्रमाणपत्र के लिए SSL_CLIENT_S_DN_CN (अभी तक) प्रदर्शित नहीं होता है

अब असहज होने के बाद:

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

और जाँच / पुनः आरंभ करना

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: // frontend: 8080 / test / phpinfo.php काम करता है और

सर्वर प्रमाण पत्र के लिए SSL_SERVER_S_DN_CN प्रदर्शित किया जाता है और क्लाइंट प्रमाणपत्र के लिए SSL_CLIENT_S_DN_CN प्रदर्शित किया जाता है

इसलिए अब हमें काम की चीजें मिल गई हैं।

कृपया बग https://trac.nginx.org/nginx/ticket/872#ticket पर ध्यान दें


आप renegotiating मुद्दे के लिए बाहर देखना चाह सकते हैं रूबी-forum.com/topic/6875137 जो शो को खराब कर सकती है
वोल्फगैंग

1

Nginx और SSL क्लाइंट प्रमाणपत्र पर काफी साफ-सुथरा लेख है; यह उदाहरण के रूप में FastCGI के साथ PHP का उपयोग करता है, लेकिन मुझे लगता है कि आप इसे रिवर्स प्रॉक्सी सेटअप के लिए अनुकूलित कर सकते हैं:

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

स्रोत http://nategood.com/client-side-certificate-authentication-in-ngi

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