Apache VirtualHost з мод-проксі та SSL


28

Я намагаюся створити сервер з декількома веб-додатками, які будуть обслуговуватися через apache VirtualHost (apache, що працює на одному сервері). Моє основне обмеження полягає в тому, що кожен веб-додаток повинен використовувати шифрування SSL. Деякий час гуглившись і переглянувши інші питання щодо stackoverflow, я написав таку конфігурацію для VirtualHost:

<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 це не так, що перешкоджає призначенню моєї конфігурації віртуального хоста. Firefox скаржиться на те, що, незважаючи на те, що він успішно підключився до сервера, з'єднання було перервано. Я також отримую таке попередження в ercher.log apache:

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 

У веб-додатку (сервер Tomcat) журнал доступу показує дивний запит доступу:

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

Далі йде правильний запит на доступ, який я отримую, коли я підключаюся безпосередньо до https://host.example.org:8443 :

"GET / HTTP/1.1" 302

Нарешті, я також зазначу, що віртуальний хост працює чудово, коли я не використовую SSL.

Як я можу змусити цю роботу?

Відповіді:


34

Нарешті я знайшов спосіб змусити його працювати. Спершу я спробував пропозицію Дейва Чейні, тому встановив інший сертифікат на сервер apache, переспрямований на порт Tomcat non SSL (тому проксі переспрямовувався на 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

Але якщо ваша мета - запустити на одному сервері кілька веб-додатків з підтримкою ssl. додаючи apache перед тим, що не збирається збалансувати їх за допомогою вказаної вище конфігурації, вам все одно знадобиться балансир навантаження або ви можете використовувати модуль балансу проксі-балансу апаче з чимось на зразок наступного:

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

В даний час мені не дуже потрібно використовувати балансування навантаження, але це може бути корисним у майбутньому. Дякуємо за розуміння.
JMD

1

Ну, я тут не розумію, чому вам потрібно мати підключення SSL від апаші до програми, яка, здається, знаходиться на тій же машині ( http: // localhost: 8443 / ).

Я думаю, що звичайним способом налаштування таких речей є встановлення апачу, що забезпечує шифрування SSL на стороні "клієнта", наприклад, в Інтернеті, і не шифроване підключення до програми. Це також дає більше свободи для налагодження відповідей вашої програми.

Інша річ, яку згадав Дейв Чейні, - це використовувати вбудований з'єднувач tomcat, щоб мати балансування навантаження та інші функції.


Ну, у мене є дві причини для вибору такої установки. Перше - це те, що сервер Tomcat вже працює і працює в SSL, і я подумав, що буде просто використовувати апаш VirtualHost з ним. Другий - провайдер програми (JIRA) надає деякі вказівки щодо інтеграції apache ( atlassian.com/software/jira/docs/v3.13/apacheintegration.html ), і я базував свою конфігурацію на цьому, додавши підтримку VirtualHost. Гадаю, це було складніше, ніж я думав, окрім того, щоб змусити його працювати, я дуже хочу зрозуміти, у чому проблема.
JMD

0

Вам дійсно потрібно проксі до сервісу HTTPS? Можливо, ви хочете проксі до служби non-sl у localhost, наприклад

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

Дійсно, використання SSL є обов'язковим для мене. Я також перевіряв проксі, не використовуючи SSL, просто перевірити, і він працює добре. Підтримка SSL - справжня проблема.
JMD

0

По-перше, я хотів би переглянути, чи можете ви зробити запит від localhost до localhost: 8443 і побачити, чи це успішно (IE зробити GET або wget http: // localhost: 8443 )

Я не зовсім впевнений, чому ваш віртуальний хост Havin ga прослуховує порт 443, а потім з'єднує його з іншим хостом ssl

Чому програма не може просто використовувати 443? якщо ви не можете змінити його, ви можете просто використовувати iptables для перенаправлення порту


Причина полягає в тому, що мені потрібно встановити більше веб-додатків на один і той же сервер, всі вони використовують SSL, і всі вони не можуть слухати на порту 443. Тому я використовую VirtualHosts на основі IP, щоб зробити вигляд, як кожен веб-додаток розміщений на своєму власному сервері. Я перевірив таку команду wget, і вона працює чудово: wget localhost: 8443 - no-check-сертифікат
JMD

2
Примітка. Просте додавання додаткових IP-адрес на ваш сервер - це просте прослуховування декількох додатків на порту 443 - все на окремих IP-адресах.
Brent

0

Перевірте свій журнал помилок SSL і переконайтеся, що у вас немає помилок щодо неможливості перевірити ланцюжок сертифікатів CA.


Якщо дійсно є помилки перевірки, що було б рішенням?
Хав'єр Мендес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.