443 default_server क्यों सुनें; nginx नियम ओवरराइड पहले से कॉन्फ़िगर किया गया नियम (HTTP नियम सामान्य तरीके से काम कर रहा है)?


9

मेरे पास एक nginx और विभिन्न उप डोमेन हैं:

a.mydomain.com
b.mydomain.com
c.mydomain.com

Nginx के 4 नियम हैं:

1) फिर से लिखना नियम:

server {
  listen 80
  server_name gl.udesk.org;

  root /nowhere;
  rewrite ^ https://a.mydomain.com$request_uri permanent;
}

2) https नियम:

server {

  listen 443;
  server_name a.mydomain.com;

  root /home/a/a/public;

  ssl on;
  ssl_certificate conf.d/ssl/a.crt;
  ssl_certificate_key conf.d/ssl/a.key;
  ssl_protocols ...
  ssl_ciphers ...
  ssl_prefer_server_ciphers on;

  location ...
}

3) http डिफ़ॉल्ट नियम:

server {
  listen 80 default_server;
  return 444;
}

4) https डिफ़ॉल्ट नियम:

server {
  listen 443 default_server;
  return 444;
}

तो अगर मैं nginx शुरू और:

  • अगर मैं http://a.mydomain.com ब्राउज़र में जाऊं तो यह https://a.mydomain.com पर रीडायरेक्ट हो जाता है और फिर यह एक त्रुटि 107 (शुद्ध :: ERR_SSL_PROTOCOL_ERROR): SSL प्रोटोकॉल त्रुटि देता है।
  • अगर मैं ब्राउज़र में https://b.mydomain.com पर जाता हूं तो मुझे उम्मीद है कि यह एरर 444 वापस कर देता है। लेकिन इसके बजाय यह वही त्रुटि 107 (शुद्ध :: ERR_SSL_PROTOCOL_ERROR) देता है: SSL प्रोटोकॉल त्रुटि।
  • और इसलिए डीएनएस प्रदाता CNAMEs (अर्थात ए, बी, सी) द्वारा पंजीकृत सभी के लिए
  • सभी http- संस्करण (जैसे नियम 3 -) अपेक्षित रूप से काम कर रहे हैं:

तो क्यों nginx में https नियम कॉन्फ़िगर करने के लिए बहुत मुश्किल हैं और मुझे http संस्करण के साथ समान व्यवहार प्राप्त करने के लिए उन्हें कैसे ठीक से कॉन्फ़िगर करना चाहिए?

अपडेट करें:

एक नया प्रमाणपत्र बनाना और जोड़ना:

ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;

अब काम करता है, लेकिन मुझे बिना किसी एसएसएल प्रमाणपत्र के समाधान की आवश्यकता होगी। बिना प्रमाणपत्र प्रदान किए https://a.mydomain.com को छोड़कर सभी https (पोर्ट 443) सबडोमेन के लिए सभी कनेक्शन रीसेट करें


2
आप नहीं कर सकते। SSL को वेब सर्वर को यह जानने से पहले एक प्रमाणपत्र की आवश्यकता होती है कि आप क्या डोमेन चाहते हैं । इसे भेजने के लिए एक प्रमाण पत्र होना चाहिए, या यह ग्राहक से बात करने के लिए कनेक्शन स्थापित नहीं कर सकता है।
डार्थ एंड्रॉइड

2
@ डारथएंड्रॉयड: जादू को एसएनआई कहा जाता है - en.wikipedia.org/wiki/Server_Name_Indication
शी

@Shi मुझे एसएनआई के बारे में पता है - यह वेबसर्वर को भेजने के लिए कौन सा प्रमाण पत्र लेने की अनुमति देता है , लेकिन इसे अभी भी एक प्रमाण पत्र चुनना होगा । nginxयह महसूस करने के लिए पर्याप्त स्मार्ट नहीं है कि उपयोगकर्ता को क्या करना है, इसके लिए उसे प्रमाणपत्र की आवश्यकता नहीं है।
डार्थ Android

जवाबों:


3

Ssl के साथ पोर्ट 443 को न मिलाएं! Nginx पूरी तरह से पोर्ट अज्ञेयवादी है। आप पोर्ट 80 के माध्यम से भी https पेश कर सकते हैं। आधुनिक नेगनेक्स संस्करण अनुमति देते हैं

listen 1234 ssl;

और आपको ssl on;तब लाइन की आवश्यकता नहीं है ।

लेकिन अगर आप https परोसना चाहते हैं तो आपको एक प्रमाण पत्र निर्दिष्ट करना होगा। जब यह http अनुरोध को https अनुरोध में फिर से लिखता है तो आपका सर्वर https में प्रवेश करता है।

आप PROTOCOL ERROR प्राप्त करते हैं, क्योंकि SSL हैंडशेक कुछ और करने से पहले किया जाता है। तो return 444पहुँचा नहीं है। और किसी भी SSL हैंडशेक को प्रमाणपत्र / निजी कुंजी जोड़ी के साथ एन्क्रिप्शन एल्गोरिदम को खिलाने के लिए एक सेरिटिफ़िकेशन और एक निजी कुंजी की आवश्यकता होगी।


3

returnनिर्देश पुनर्लेखन मॉड्यूल का हिस्सा है। यदि आप दस्तावेज़ की जाँच करते हैं , तो आप देख सकते हैं कि यह अनुरोधों के साथ काम करता है। एचटीटीपीएस में हैंडशेक समाप्त होने के बाद ही अनुरोध किया जा सकता है।

एक सुविधा का अनुरोध है: https://trac.nginx.org/nginx/ticket/195 और एक समाधान समाधान प्रदान किया गया है।

server {
    listen 443 ssl;
    server_name bbb.example.com;
    ssl_ciphers aNULL;
    ssl_certificate /path/to/dummy.crt;
    ssl_certificate_key /path/to/dummy.key;
    return 444;
}

ध्यान दें कि यह गैर SNI-सक्षम HTTPS ग्राहकों (nginx की अपनी तरह टूट जाएगा proxy_passजब तक कि आप निर्धारित करते हैं, proxy_ssl_server_name on;किसी अन्य) तक पहुँचने से server_names(ताकि अनिवार्य रूप से तोड़ने के वैध server_nameरों कि आप करते हैं के माध्यम से जाने के लिए चाहते हैं)। देखें trac.nginx.org/nginx/ticket/195#comment:11 जानकारी के लिए।
nh2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.