2016-07-14 16 views
7

दुर्भाग्य से मैं सिस्टम प्रशासक का अधिकतर नहीं हूं और एक समस्या पर आ गया है जिसने मुझे दीवार के खिलाफ अपने सिर को टक्कर लगी है।हरोकू के लिए Nginx रिवर्स प्रॉक्सी एसएसएल हैंडशेक

लघु कहानी है कि मैं Nginx (उबंटू 14.04.4 LTS) चल रहा हूँ (क) मेरी कंपनी के विपणन साइट (https://example.com, जो संयोग से Wordpress है) और (ख) के लिए एक रिवर्स प्रॉक्सी के रूप में सेवा की मेजबानी के लिए EC2 पर है कुछ मार्गों के लिए, हमारे रेल ऐप हरोकू (https: // app.example.com) पर चल रहे हैं। हम example.com और app.example.com दोनों के लिए एक ही SSL प्रमाणपत्र का उपयोग करते हैं। इन सभी ने 8-10 महीनों के लिए बहुत अच्छा काम किया है, लेकिन मैंने हाल ही में हेरोकू के सशुल्क एसएसएल एडन से नई मुफ्त एसएसएल पेशकश में स्विच किया है, और अब हमारी रिवर्स प्रॉक्सी टूटी हुई है।

Nginx त्रुटि लॉग की जाँच में, मैं निम्न देखें:

SSL_do_handshake() failed (SSL: error:14094438:SSL routines:SSL3_READ_BYTES:tlsv1 alert internal error:SSL alert number 80) while SSL handshaking to upstream, client: ipaddress1, server: example.com, request: "GET /proxiedpath/proxiedpage HTTP/1.1", upstream: "https:// ipaddress2:443/proxiedpath/proxiedpage", host: "example.com"

मैं कुछ अतिरिक्त मार्गदर्शन के लिए चारों ओर खोज करने के लिए कोशिश की है - मैं Nginx (1.10.1) और OpenSSL (1.0 अपग्रेड किया है। 2 एच) कोई भाग्य के साथ। मुझे संदेह है कि यह समस्या नई फ्री एसएसएल सुविधा (https://devcenter.heroku.com/articles/ssl-beta) में एसएनआई के हेरोकू के उपयोग के कारण हो सकती है, लेकिन यह निर्धारित करने में सक्षम नहीं है कि यह समस्या क्यों हो सकती है।

एक इस मुद्दे पर मेरी खोज पर कुछ अतिरिक्त बिंदु:

  • जब मैं नया मुफ्त Heroku एसएसएल का प्रयोग किया, मैं app.example.com को इंगित करने के लिए हमारे app.example.com DNS रिकॉर्ड बदल .herokudns.com, जैसा दस्तावेज़ों द्वारा निर्देशित किया गया है। एप्लिकेशन को app.example.com के माध्यम से सामान्य रूप से एक्सेस किया जा सकता है और जब मैं app.example.com और app.example.com.herokudns.com पर nslookup चलाता हूं, तो मुझे एक ही आईपी पता वापस मिलता है। हालांकि ...

  • मैं nslookup या app.example.com.herokudns.com से आईपी पते के माध्यम से एप्लिकेशन तक नहीं पहुंच सकता। मुझे संदेह है कि यह सामान्य है और उम्मीद है लेकिन यह बिल्कुल कहने के लिए पर्याप्त नहीं है कि यह क्यों है। और ...

  • nslookup से लौटा आईपी पता उपरोक्त लॉग के त्रुटि संदेश ("ipaddress2") में संदर्भित आईपी पते जैसा नहीं है। वास्तव में, "ipaddress2" पूरे लॉग में संगत नहीं है - ऐसा लगता है कि यह नियमित रूप से बदल जाता है। फिर मुझे यह जानने के लिए पर्याप्त नहीं पता कि मुझे क्या पता नहीं है ... हेरोकू की तरफ लोड संतुलन? बहुत बहुत धन्यवाद -

    http { 
    
        client_max_body_size 500M; 
    
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
        keepalive_timeout 65; 
        types_hash_max_size 2048; 
    
        server_names_hash_bucket_size 64; 
    
        include /etc/nginx/mime.types; 
        default_type application/octet-stream; 
    
        access_log /var/log/nginx/access.log; 
        error_log /var/log/nginx/error.log; 
    
        gzip on; 
        gzip_disable "msie6"; 
    
        server { 
    
         listen 443 default_server; 
         server_name example.com; 
    
         root /usr/share/nginx/html; 
         index index.php index.html index.htm; 
    
         ssl on; 
         ssl_certificate mycompanycert.crt; 
         ssl_certificate_key mycompanykey.key; 
    
         ssl_session_timeout 5m; 
    
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
         ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; 
         ssl_prefer_server_ciphers on; 
    
         error_page 404 /404.html; 
         error_page 500 502 503 504 /50x.html; 
    
         location/{ 
          try_files $uri $uri/ /index.php?q=$uri&$args; 
         } 
    
         location ^~ /proxiedpath/ { 
          proxy_set_header X-Real-IP $remote_addr; 
          proxy_set_header X-Forwarded-Proto https; 
          proxy_pass https://app.example.com/proxiedpath/; 
         } 
    
        } 
    
    } 
    

    किसी भी मदद की बहुत सराहना की है:

और अंत में, मेरी Nginx रिवर्स प्रॉक्सी nginx.conf में इस प्रकार कॉन्फ़िगर किया गया है!

+0

अपने 2 साइटों में एक ही सर्वर पर होस्ट कर रहे हैं? क्या आप हमें 'app.mycompany.com' की कॉन्फ़िगरेशन दिखा सकते हैं? अगर वे एक ही सर्वर पर हैं तो आप '301 https लौट सकता है क्योंकि: //app.mycompany.com/proxiedpath/;' और nginx एक ही प्रमाण पत्र के साथ का उपयोग कर 'app.mycompany.com' सर्वर नाम अनुरोध को पूरा करने। –

+0

दुर्भाग्य से वे पूरी तरह से अलग कर रहे हैं - प्रॉक्सी सर्वर एडब्ल्यूएस पर सेटअप और अनुप्रयोग सर्वर Heroku पर होस्ट की है (मैं अपेक्षाकृत कम नियंत्रण या यहाँ तक कि config करने के लिए जानकारी है जहां) (जहाँ मैं config का पूरा नियंत्रण है) है। हालांकि इस बदलाव से पहले यह काम करता था, इसलिए मुझे पता है कि यह काफी छोटी बात होनी चाहिए। – Bart

+0

इसके अलावा, जोड़ना चाहता था - एसईओ कारणों के लिए यह हमारे लिए महत्वपूर्ण है कि ये पृष्ठ mycompany.com पर ऐप.mycompany.com पर विरोध करते हैं, जहां वास्तव में उनकी सेवा की जा रही है। – Bart

उत्तर

10

मैं आज इसे हल करने में सक्षम था और अन्य मुद्दों को चलाने के मामले में समाधान पोस्ट करना चाहता था।

यह पता चला है कि समस्या एसएनआई से संबंधित थी।

https://trac.nginx.org/nginx/ticket/229

कौन सा मुझे proxy_ssl_server_name निर्देश के लिए नेतृत्व किया:

http://nginx.org/r/proxy_ssl_server_name

की स्थापना करके करने के लिए "पर" अपने config में, आप में सक्षम हो जाएगा मैं nginx.org पर इस टिकट मिला एसएनआई का उपयोग कर अपस्ट्रीम होस्ट्स को प्रॉक्सी करने के लिए।

उन सभी के लिए धन्यवाद जिन्होंने सुझावों के साथ टिप्पणी की!

+0

यह http://stackoverflow.com/questions/25329941/nginx-caching-proxy-fails-with-ssl23-get-server-hellosslv3-alert जैसा ही है -handshake-fail/25330027 # 25330027 केवल एक चीज यह है कि आपको टीएलएस 1.0 या उससे ऊपर भी लागू करना चाहिए, अन्यथा एसएनआई का उपयोग नहीं किया जाएगा। – gubble

+0

इस उत्तर के लिए धन्यवाद। मैंने सोचा कि यह जवाब ढूंढना आसान होगा लेकिन Google ने ऐसा नहीं सोचा था –

0

एक संबंधित शर्त यह है कि Heroku लगाता है दूसरों के लिए एक नोट के रूप में है कि होस्ट क्षेत्र कस्टम डोमेन नाम से मेल खाना चाहिए है।

तो proxy_ssl_server_name के अलावा आप भी तरह की एक पंक्ति सेट कर सकते हैं:

proxy_set_header Host mycustomdomain.com; 

बेशक यह तभी लागू होता यदि होस्ट फ़ील्ड Sever में आगत डोमेन है कि आपके सर्वर में रहता है से अलग है।

विशिष्ट त्रुटि आप प्राप्त है:

SSL certificate error

There is conflicting information between the SSL connection, its certificate and/or the included HTTP requests.

संबंधित मुद्दे