Apache VirtualHost को मॉड-प्रॉक्सी और SSL के साथ


28

मैं कई वेब अनुप्रयोगों के साथ एक सर्वर स्थापित करने की कोशिश कर रहा हूं, जो सभी को Apache VirtualHost (एक ही सर्वर पर चल रहे अपाचे) के माध्यम से परोसा जाएगा। मेरा मुख्य बाधा यह है कि प्रत्येक वेब एप्लिकेशन को SSL एन्क्रिप्शन का उपयोग करना चाहिए। थोड़ी देर के लिए गुगली करने और स्टैकओवरफ़्लो पर अन्य प्रश्नों को देखने के बाद, मैंने वर्चुअलबॉस्ट के लिए निम्न कॉन्फ़िगरेशन लिखा:

<VirtualHost 1.2.3.4:443>
    ServerName host.example.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

भले ही https://host.example.org:8443 सुलभ है, https://host.example.org नहीं है, जो मेरे वर्चुअल होस्ट कॉन्फ़िगरेशन के उद्देश्य को पराजित करता है। फ़ायरफ़ॉक्स शिकायत करता है कि, भले ही वह सर्वर से सफलतापूर्वक जुड़ा हो, लेकिन कनेक्शन बाधित था। अपाचे की त्रुटि में मुझे निम्न चेतावनी भी मिलती है।

proxy: no HTTP 0.9 request (with no host line) on incoming request and preserve host set forcing hostname to be host.example.org for uri 

वेब एप्लिकेशन (एक टॉमकैट सर्वर) पर एक्सेस लॉग एक अजीब एक्सेस अनुरोध दिखाता है:

"?O^A^C / HTTP/1.1" 302

जब मैं सीधे https://host.example.org:8443 से जुड़ता हूं तो मुझे सही पहुंच प्राप्त होती है :

"GET / HTTP/1.1" 302

अंत में मुझे यह भी उल्लेख करना चाहिए कि जब मैं एसएसएल का उपयोग नहीं करता तो वर्चुअल होस्ट पूरी तरह से ठीक काम करता है।

मै इसे काम मे कैसे ले सकता हूँ?

जवाबों:


34

अंत में मुझे इसे काम करने का एक तरीका मिला। पहले मैंने डेव चेनी सुझाव की कोशिश की, इसलिए मैंने टोमैट नॉन एसएसएल पोर्ट पर रीडायरेक्ट सर्वर के लिए एक अन्य प्रमाणपत्र स्थापित किया (ताकि प्रॉक्सी http: // localhost: 8080 / ) पर रीडायरेक्ट हो । दुर्भाग्य से यह पूरी तरह से वेब ब्राउज़र में काम नहीं करता था क्योंकि कनेक्शन के तुरंत बाद https को http में बदल दिया गया था। इसलिए मैंने https: // localhost: 8443 / और इसे काम करने के लिए अंतिम स्पर्श का उपयोग करके फिर से SSLProxyEngine को जोड़ा।

यहाँ परिणामी VirtualHost विन्यास है:

<VirtualHost 1.2.3.4:443>
    ServerName host.domain.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLEngine on
    SSLProxyEngine On
    SSLCertificateFile /etc/apache2/ssl/certificate.crt
    SSLCertificateKeyFile /etc/apache2/ssl/certificate.key

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

1
इससे बचें ProxyPreserveHost Onयह लगभग हमेशा गलत है, बेकार है और लगभग हमेशा टूटता है ProxyPassReverse। एक साइड नोट ProxyRequests offके रूप में डिफ़ॉल्ट है, इस प्रकार निरर्थक।
kubanczyk

जब हम बाहरी IP का उपयोग करते हैं तो इसके बजाय localhostयह काम नहीं कर रहा है।
चमिंडा बंडारा

4

इस विन्यास की कोशिश करो

<VirtualHost 1.2.3.4:443>
    ServerName host.domain.org

    SSLEngine On
    # include other ssl options, like cert and key here

    ProxyRequests Off
    ProxyPreserveHost On

    <Location />
        ProxyPass http://localhost:8443/
    </Location>
</VirtualHost>

यदि आपके एप्लिकेशन को अनुमानित कनेक्शन से SSL जानकारी तक पहुंचने की आवश्यकता है, तो आपको mod_proxy_ajp और tomcat ajp1.3 कनेक्टर का उपयोग करने पर विचार करना चाहिए।


मैं सर्वर पर एन्क्रिप्ट होने के साथ प्रमाण पत्र उत्पन्न करूंगा जहां host.domain.org के लिए आवेदन चल रहा है। फिर मुझे प्रॉक्सी सर्वर पर उसी प्रमाण पत्र का पुन: उपयोग करना होगा?
Giox

2

लेकिन अगर आप एक ही सर्वर पर कई एसएसएल सक्षम वेब एप्लिकेशन चलाना चाहते हैं। सामने के अपाचे को जोड़ने से आपके ऊपर के विन्यास का उपयोग करके उन्हें संतुलित नहीं किया जा सकता है, फिर भी आपको लोड बैलेंसर की आवश्यकता होगी या आप निम्नलिखित जैसे कुछ के साथ अपाचे के प्रॉक्सी बैलेंसर मॉड्यूल का उपयोग कर सकते हैं:

ProxyRequests Off

<Proxy balancer://someapplication>
    BalancerMember http://127.0.0.1:18443 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18444 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18445 keepalive=on max=2 retry=30
</Proxy>


<VirtualHost 1.2.3.4:443>
    SSLEngine on
    SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile //path/to/key.pem
    SSLVerifyClient optional

    RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

<Location />
    SetHandler balancer-manager
    Order allow,deny
    Allow from all
</Location>

ProxyPass / balancer://someapplication:443/
ProxyPassReverse / balancer://someapplication:443/
ProxyPreserveHost on

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

1

ठीक है, जो मुझे यहाँ समझ में नहीं आ रहा है, वह यह है कि आपको अपने अपाचे से अपने आवेदन में एक SSL कनेक्शन की आवश्यकता है जो एक ही मशीन ( http: // localhost: 8443 / ) पर लगता है।

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

डेव चेनी ने जिस दूसरी चीज का उल्लेख किया है, वह लोडिंग बैलेंसिंग और अन्य फीचर्स के लिए देशी टॉमकैट कनेक्टर का उपयोग करना है।


वैसे मेरे पास इस तरह के सेटअप को चुनने के दो कारण हैं। पहला यह है कि टॉमकैट सर्वर पहले से ही एसएसएल में चल रहा है और मुझे लगा कि इसके लिए अपाचे वर्चुअलाइजेशन का इस्तेमाल करना आसान होगा। दूसरा यह है कि एप्लिकेशन का प्रदाता (JIRA) अपाचे एकीकरण ( atlassian.com/software/jira/docs/v3.13/apacheintegration.html ) के लिए कुछ दिशानिर्देश प्रदान करता है और मैंने VirtualHost समर्थन को जोड़कर इस पर अपना कॉन्फ़िगरेशन आधारित किया है। लगता है कि जितना मैंने सोचा था उससे अधिक जटिल था, यह काम करने के अलावा मैं वास्तव में समझना चाहता हूं कि समस्या क्या है।
जेएमडी

0

क्या आपको वास्तव में एक HTTPS सेवा के लिए प्रॉक्सी की आवश्यकता है? आप लोकलहोस्ट में गैर-एसएसएल सेवा के लिए प्रॉक्सी करना चाहते हैं, जैसे

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

वास्तव में एसएसएल का उपयोग करना मेरे लिए अनिवार्य है। मैंने एसएसएल का उपयोग किए बिना प्रॉक्सी को भी जांचने के लिए परीक्षण किया और यह ठीक काम करता है। एसएसएल समर्थन असली मुद्दा है।
जेएमडी

0

पहले मैं देखूंगा कि क्या आप लोकलहोस्ट से लोकलहोस्ट: 8443 पर रिक्वेस्ट कर सकते हैं और देखें कि क्या यह सफल होता है (IE एक GET या wget http: // localhost: 8443 )

मुझे यकीन नहीं है कि क्यों अपने havin GA आभासी मेजबान पोर्ट 443 पर सुन रहा है तो यह एक और ssl मेजबान को proxying

क्यों नहीं कर सकते आवेदन सिर्फ देशी 443 का उपयोग करें? यदि आप इसे बदल नहीं सकते हैं तो आप पोर्ट को रीडायरेक्ट करने के लिए सिर्फ iptables का उपयोग कर सकते हैं


कारण यह है कि मुझे एक ही सर्वर पर अधिक वेब एप्लिकेशन इंस्टॉल करने की आवश्यकता है, सभी एसएसएल का उपयोग कर रहे हैं और वे सभी पोर्ट 443 पर नहीं सुन सकते हैं। इसलिए मैं आईपी आधारित वर्चुअलहॉस्ट्स का उपयोग कर रहा हूं ताकि यह दिख सके कि प्रत्येक वेब एप्लिकेशन को अपने स्वयं के सर्वर पर होस्ट किया जाता है। मैंने निम्नलिखित wget कमांड का परीक्षण किया और यह ठीक काम करता है: wget localhost: 8443 --no-check-certificate
JMD

2
नोट - अपने सर्वर में अतिरिक्त आईपी पते जोड़ना एक साधारण बात है, और इस प्रकार कई अनुप्रयोगों को पोर्ट 443 पर सुनना पड़ता है - सभी अलग-अलग आईपी पते पर।
ब्रेंट

0

अपने SSL त्रुटि लॉग की जाँच करें और सुनिश्चित करें कि आपके पास CA प्रमाणपत्र श्रृंखला को सत्यापित करने में असमर्थ होने के बारे में कोई त्रुटि नहीं है।


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