nginx: सभी एसएसएल सर्वर ब्लॉक को एसएसएल के रूप में अभिनय करने से कैसे रोका जाए


17

मेरे पास कई वर्चुअल सर्वर के साथ एक वेब सर्वर है। जिनमें से केवल 1 एसएसएल है। समस्या यह है, क्योंकि SSL के लिए कोई कैटचेल सर्वर ब्लॉक नहीं है, अन्य साइट पर किसी भी https अनुरोध 1 SSL ब्लॉक द्वारा परोसा जाता है।

मेरा विन्यास, अनिवार्य रूप से, इस तरह दिखता है:

# the catch all
server {
  listen 80 default;

  # I could add this, but since I have no default cert, I cannot enable SSL,
  # and this listen ends up doing nothing (apparently).
  # listen 443; 

  server_name _;
  # ...
}

# some server
server {
  listen 80;
  server_name server1.com;
  # ...
}

# some other server ...
server {
  listen 80;
  server_name server2.com;
  # ...
}

# ... and it's https equivalent
server {
  listen 443;
  ssl on;
  server_name server2.com;
  # ...
}

अब चूंकि 443 के लिए कोई डिफॉल्ट श्रोता नहीं है, इसलिए अनुरोध जैसे https://server1.comकि server2.comhttps ब्लॉक द्वारा दिया जाएगा । इस के लिए तर्क इस प्रकार server_nameमें डॉक्स।

यदि कोई मेल नहीं है, तो कॉन्फ़िगरेशन फ़ाइल में एक सर्वर {...} ब्लॉक निम्न क्रम के आधार पर उपयोग किया जाएगा:

  1. मेल खाने वाले निर्देश के साथ सर्वर ब्लॉक को [डिफ़ॉल्ट | default_server] के रूप में चिह्नित किया गया है।
  2. मिलान सुनने के निर्देश के साथ पहला सर्वर ब्लॉक (या अंतर्निहित 80 सुनें;)

इस समस्या का पसंदीदा समाधान क्या है? क्या मुझे अपने कैच ऑल सर्वर ब्लॉक के लिए डमी सर्टिफिकेट सेट करने की जरूरत है ताकि मैं 443 पर सुनूं और खराब अनुरोधों को संभाल सकूं? क्या कोई ऐसा पैरामीटर है जिससे मैं अनजान हूं, एक सटीक hostname के साथ मेल खाता है server?


जब लोग https का उपयोग करके अन्य साइटों तक पहुँचने का प्रयास करते हैं तो आप क्या करना चाहते हैं?
डेविड श्वार्ट्ज

आदर्श रूप से या तो मैं nginx पसंद करूँगा जब तक कि होस्टनाम मेल न खाए, या इसके लिए उसी होस्ट पर http को पुनर्निर्देशित न करे।
नंबर 1311407

जवाबों:


9

आदर्श रूप से या तो मैं nginx पसंद करूँगा जब तक कि होस्टनाम मेल न खाए, या इसके लिए उसी होस्ट पर http को पुनर्निर्देशित न करे।

न ही संभव है। Https://foo.example.com/ पर जाने वाले क्लाइंट से कनेक्शन को कुछ भी स्वीकार नहीं किया जा सकता है, लेकिन इसके नाम के रूप में "foo.example.com" के साथ एसएसएल प्रमाणपत्र। SSL कनेक्शन स्वीकार किए जाने तक पुनर्निर्देशित करने का कोई अवसर नहीं है।

यदि आप SSL के लिए प्रत्येक साइट को कॉन्फ़िगर करते हैं, तो एक उपयोगकर्ता जो प्रमाणपत्र त्रुटि के माध्यम से क्लिक करता है, उसे वह साइट मिलेगी जो उन्होंने अनुरोध की थी। यदि आप एसएसएल के लिए एक "कैच ऑल" साइट को कॉन्फ़िगर करते हैं जो केवल एक त्रुटि पेज प्रदान करता है और एक साइट के लिए नाम-आधारित वर्चुअल होस्टिंग कॉन्फ़िगर करता है जो एसएसएल का समर्थन करने वाला है, तो आप क्लाइंट के लिए एक त्रुटि पृष्ठ पर काम कर सकते हैं।

एसएसएल और एचटीटीपी वर्चुअल होस्टिंग सिर्फ एक साथ नहीं खेलते हैं।


डॉक्स पढ़ने के बाद मैं यही इकट्ठा हुआ। मैं उम्मीद कर रहा था कि मैं कुछ याद करूँगा। मुझे एसएसएल चेतावनियों की बिल्कुल भी परवाह नहीं है। मैं तो बस किसी को दर्ज करने के लिए नहीं करना चाहती server1.com और पाते हैं खुद को server2.com ... के मुखपृष्ठ पर देख रहे हैं वहाँ वास्तव में कोई रास्ता नहीं करने के लिए nginx बताने के लिए है नहीं एक अनुरोध को स्वीकार?
नंबर 1311407

यदि यह अनुरोध स्वीकार नहीं करता है, तो पहली साइट काम नहीं करेगी। यह पता लगाने के लिए अनुरोध को स्वीकार करना होगा कि उपयोगकर्ता किस साइट तक पहुंचने का प्रयास कर रहा है।
डेविड श्वार्ट्ज

2
"एक क्लाइंट से कनेक्शन जो foo.example.com पर जाता है, उसे इसके नाम के रूप में" foo.example.com "के साथ एसएसएल प्रमाणपत्र के साथ कुछ भी स्वीकार नहीं किया जा सकता है।" - यह सही नहीं है, सर्वर अनुरोध को स्वीकार करेगा और यह पुष्टि करने के लिए क्लाइंट पर निर्भर है कि अनुरोधित डीएन सर्वर प्रमाणपत्र डीएन से मेल खाता है।
कॉलिनम

4

एकमात्र तरीका यह है कि एक स्व-हस्ताक्षरित एसएसएल प्रमाणपत्र बनाया जाए और इसका उपयोग आने वाले https अनुरोधों पर नियंत्रण पाने के लिए किया जाए। आप इस पोस्ट में उल्लिखित कुछ सरल चरणों में अपना स्व-हस्ताक्षरित एसएसएल प्रमाणपत्र बना सकते हैं ।

मान लें कि आप एक स्व-हस्ताक्षरित प्रमाण पत्र बनाते हैं, जिसमें server.crt का फ़ाइल नाम होता है। फिर आप अपने nginx कॉन्फ़िगरेशन में निम्नलिखित संलग्न करेंगे:

server {
    listen  443;

    ssl    on;
    ssl_certificate         /etc/nginx/ssl/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/server.key;

    server_name server1.com;

    keepalive_timeout 60;
    rewrite ^       http://$server_name$request_uri? permanent;
}

आपको अभी भी ब्राउज़र SSL चेतावनी संदेश मिलेगा, लेकिन कम से कम आपके पास आगे क्या होता है, इस पर नियंत्रण होगा।


1
मैं इससे सहमत हु। अविश्वास प्रमाण पत्र के बारे में चेतावनी संदेश दिखाने वाले ब्राउज़र की समस्या है, लेकिन अगर आप केवल अपने वास्तविक vhosts के लिए सर्वर को समान रूप से अमान्य प्रमाणपत्र प्राप्त करने के लिए https: // <ip-address> जाने वाले उपयोगकर्ताओं को रोकने की कोशिश कर रहे हैं (अमान्य क्योंकि hostname मेल नहीं खाएगा), तो आप उन्हें अवैध रूप से स्व-हस्ताक्षरित डमी प्रमाणपत्र प्रदान करने से बेहतर हैं। उस तरह का उन्हें बताता है "यहाँ देखने के लिए कुछ भी नहीं है, एक अन्य मेजबान से प्रमाण पत्र भी नहीं"।
डैनियल एफ

2

कैच-ऑल सर्वर ब्लॉक और रिटर्न स्टेटस कोड 444 जोड़ें। यह किसी भी डेटा को भेजने से पहले कनेक्शन को बंद करने के लिए nginx को बताता है।

server {
    listen 443 default_server ssl;
    server_name _;
    return 444;
}

1

इन दिनों आप TLS सर्वर नेम इंडिकेशन एक्सटेंशन (SNI, RFC 6066) का उपयोग कर सकते हैं। HTTPS श्रोता उपयुक्त प्रमाण पत्र की सेवा करने से पहले डोमेन नाम को पहचानने में सक्षम होंगे।

इसका मतलब है कि आपको अपने सभी डोमेन के लिए प्रमाणपत्र की आवश्यकता होगी, और जब एसएनआई का उपयोग अन्य डोमेन में से किसी एक को पहचानने के लिए किया जाता है, तो आप HTTP 301 गैर-एन्क्रिप्टेड संस्करण में पुनर्निर्देशित कर सकते हैं जब तक कि सर्वर का नाम एकल से मेल नहीं खाता है, जिसकी आवश्यकता है एन्क्रिप्शन।

SNI के बारे में अधिक जानकारी nginx प्रलेखन में उपलब्ध है http://nginx.org/en/docs/http/configuring_https_servers.html


0

http {}ब्लॉक में मान्य होस्टनामों के लिए अनुरोध किए गए होस्टनाम को मैप करें :

map $ssl_server_name $correct_hostname_example {
  default 0;
  example.com 1;
  www.example.com 1;
}

और फिर server {}गलत होस्टनाम के साथ ब्लॉक किल कनेक्शन में:

if ($correct_hostname_example = 0) {
  return 444;
}

कई सर्वर ब्लॉक के लिए आवश्यक के रूप में कई नक्शे का उपयोग करें। कनेक्शन अभी भी आपके किसी प्रमाण पत्र का उपयोग करके स्थापित किया जाएगा, लेकिन यदि यह अंतिम ब्लॉक SSL परोसने वाले हर सर्वर ब्लॉक में मौजूद है, तो प्रभावी रूप से आप अवैध होस्टनाम के साथ कनेक्शन को "ब्लॉक" करेंगे। यह केवल पहले सर्वर ब्लॉक में ही आवश्यक हो सकता है, लेकिन हर सर्वर ब्लॉक में इसे जोड़ने से यह सुनिश्चित होगा कि आदेश कोई फर्क नहीं पड़ता।

$ssl_server_nameचर nginx 1.7 या अधिक से अधिक में मौजूद है।


0

मैंने इस समस्या को हल किया है:

  1. स्व-हस्ताक्षरित प्रमाणपत्र बनाएं:

openssl req -nodes -x509 -newkey rsa:4096 -keyout self_key.pem -out self_cert.pem -days 3650

  1. इसे कॉपी करें जहां NginX इसे पा सकता है:

cp self*.pem /etc/nginx/ssl/

  1. कैच-ऑल रूट सेट करें:
server {
    listen 443 default_server ssl;

    ssl on;
    ssl_certificate /etc/nginx/ssl/self_cert.pem;
    ssl_certificate_key /etc/nginx/ssl/self_key.pem;

    return 301 http://$host;
}

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

चेतावनी :

यदि आपकी SLL- सक्षम साइट केवल परिभाषित करती है www.example.com(और नहीं example.com) तो आपका कैच-ऑल रूट https://example.comस्व-हस्ताक्षरित प्रमाणपत्र और संबंधित चेतावनी के साथ सेवा समाप्त कर देगा ।


-2

Http पर पुनर्निर्देशित करें:

server {
    listen       443;
    server_name  *.com;
    rewrite        ^ http://$host$request_uri? permanent;
}    

वापसी 404 4

server {
    listen       443;
    server_name  *.com;
    return 404;
}    

1
यह अभी भी एक एसएसएल चेतावनी के परिणामस्वरूप होगा, क्योंकि एसएसएल सुरंग को स्थापित करने की आवश्यकता होती है, इससे पहले कि कोई HTTP रीडायरेक्ट होगा। डेविड श्वार्ट्ज का स्वीकृत उत्तर देखें।
ccc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.