Nginx। असूचीबद्ध ssl वर्चुअल सर्वर के अनुरोध को मैं कैसे अस्वीकार करूं?


14

मेरे पास एक ही आईपी पर वाइल्डकार्ड एसएसएल प्रमाणपत्र और कई उप-डोमेन हैं। अब मैं चाहता हूं कि मेरा नगीनेक्स केवल उल्लेखित सर्वर नामों को संभाले और दूसरों के लिए कनेक्शन छोड़ दे ताकि ऐसा लगे कि nginxअसूचीबद्ध सर्वर नामों के लिए नहीं चल रहा है (जवाब में अस्वीकार, अस्वीकार, मृत नहीं, प्रतिक्रिया में एक भी बाइट नहीं)। मैं निम्न कार्य करता हूं

ssl_certificate         tls/domain.crt;
ssl_certificate_key     tls/domain.key;

server {
  listen 1.2.3.4:443 ssl;
  server_name validname.domain.com;
  //
}

server {
  listen 1.2.3.4:443 ssl;
  server_name _;
  // deny all;
  // return 444;
  // return 404;
  //location {
  //  deny all;
  //}
}

मैं पिछले सर्वर ब्लॉक में लगभग सब कुछ करने की कोशिश की है, लेकिन कोई सफलता नहीं। मुझे ज्ञात वर्चुअल सर्वर या त्रुटि कोड से या तो वैध प्रतिक्रिया मिलती है। कृपया मदद कीजिए।

जवाबों:


7

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


यह बुरा है, लेकिन मानना ​​पड़ेगा) धन्यवाद।
औरबी

3
यह सच नहीं है: आप निचले स्तर पर कुछ और कर सकते हैं, जैसे बिना किसी प्रतिक्रिया के कनेक्शन छोड़ना, जैसा कि अन्य उत्तरों में बताया गया है।
1919 को collimarco

14

SSL सक्षम होने पर पहले से ही cjc द्वारा दिए गए उत्तर ने मेजबान नामों के मिलान की कोशिश में समस्या को सही ढंग से इंगित किया। हालांकि, यह इस तरह से करना संभव है:

server {
    ...

    if ($host !~* ^validname\.domain\.com$ ) {
        return 444;
    }
    ...
}

नोट: हाँ यह सच है कि आम तौर ifपर बुराई है , लेकिन ifइस मामले में उपयोग करना सुरक्षित है । (अगर आपको खुद को समझाने की जरूरत है तो जुड़े हुए पेज को पढ़ें।)

इसके विपरीत जो सुझाया गया है, बस निम्नलिखित ब्लॉक को जोड़ने से काम नहीं चलेगा:

server {
    listen 80;
    listen 443 ssl;
    return 444;
}

क्योंकि एक SSL प्रमाणपत्र जो validname.domain.comकुछ यादृच्छिक डोमेन नाम से मेल नहीं खाता है। मैंने इसे आज़माया है, और नाज़िनक्स ने अभिनय किया जैसे ब्लॉक बिल्कुल मौजूद नहीं था।

यह भी काम नहीं करेगा:

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

क्योंकि यह पोर्ट 443 पर हर एक HTTPS कनेक्शन को विफल कर देगा, यहां तक ​​कि उन से भी गुजरना चाहिए। मैंने भी यह कोशिश की है। wgetSSL हैंडशेक त्रुटि की सूचना दी।


यह उत्तर बिलकुल सही है। बस उन लोगों के लिए जो संदेह करते हैं कि आपको इस अनुभाग को कार्यशील सर्वर कॉन्फ़िगरेशन में जोड़ना चाहिए। तो विषय स्टार्टर के लिए सर्वर होगा {सुनो 443 एसएसएल; server_name validname.domain.com; अगर ($ होस्ट! ~ * ^ वैधनाम \ _domain \ .com $) {रिटर्न 444; }}
इवान येरेमचुक

6

यहां अधिकांश उत्तर इस बारे में हैं कि यह काम क्यों नहीं करता है, न कि यह कैसे काम करता है।

यहाँ बताया गया है कि - आपको ऐसे कैच-ऑल सर्वर को एक 'default_server' बनाने की जरूरत है और सर्टिफिकेट / की को रास्ता देने की आवश्यकता है ताकि यह आने वाले ssl अनुरोध को डिक्रिप्ट कर सके और होस्ट हेडर से मेल खा सके:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>;
    ssl_certificate_key <path to key>;
    return 404;
}

वहां ssl_certificate / ssl_certificate_key नोट करें। यदि वे निर्दिष्ट नहीं हैं, तो nginx अभी भी ऐसे default_server का उपयोग करने की कोशिश करता है और विफल रहता है क्योंकि यह ssl कनेक्शन w / oa cert / key को स्वीकार नहीं कर सकता है। कोई भी स्व-हस्ताक्षरित किसी भी प्रमाणपत्र / कुंजी का उपयोग कर सकता है। ...

स्व-हस्ताक्षरित प्रमाण पत्र बनाने के लिए:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 

इसके अलावा /server//a/841643/87439 देखें


1
क्या आपने यह कोशिश की है? आप एक SSL प्रमाणपत्र कैसे बनाते हैं जो "_" के सर्वर नाम से मेल खाता है?
टिम

हां, यह समाधान मेरे लिए काम करता है। मुझे एक ही सटीक समस्या थी और प्रलेखन से पता चला कि nginx को एक प्रमाणपत्र / कुंजी की आवश्यकता है क्योंकि यह TLS SNI को नहीं देखता है। आप किसी भी प्रमाणित / कुंजी का उपयोग कर सकते हैं, उदाहरण के लिए स्व-हस्ताक्षरित।
andreycpp

1

मैंने आज उपरोक्त समाधान को लागू किया, और इसने तैरने का काम किया। निर्दिष्ट किए गए सभी URL अब हटाए नहीं गए हैं। वास्तविक वर्चुअल सर्वर प्रविष्टि से पहले इस सर्वर कोड को रखना महत्वपूर्ण था - सभी मेल-जोल वाले URL अब इस 'डिफ़ॉल्ट' सर्वर पर जाते हैं।

... 
server {
     listen       443;
     server_name    _;
     return 444; }

server {
     listen       443;
     server_name  [URL]

0

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

http {
    ...

    server {
        listen 80;
        listen 443 ssl;
        return 444;
    }

    server {
        server_name validname.domain.com;
        ...
    }
}

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


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