Apache VirtualHost с мод-прокси и SSL


28

Я пытаюсь настроить сервер с несколькими веб-приложениями, которые будут обслуживаться через Apache VirtualHost (Apache работает на одном сервере). Моим главным ограничением является то, что каждое веб-приложение должно использовать шифрование SSL. Пройдя некоторое время, погуглив и посмотрев другие вопросы о стековом потоке, я написал следующую конфигурацию для 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 жалуется на то, что, хотя он успешно подключился к серверу, соединение было прервано. Я также получаю следующее предупреждение в apache error.log:

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 без порта 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по умолчанию, таким образом, излишним.
Кубанчик

Когда мы используем внешний 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 впереди не приведет к их балансировке с помощью вышеуказанного конфига, вам все равно понадобится балансировщик нагрузки или вы можете использовать прокси-балансировочный модуль 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-соединение от вашего apache к вашему приложению, которое, кажется, находится на той же машине ( http: // localhost: 8443 / ).

Я предполагаю, что обычный способ настроить такие вещи - это иметь apache, обеспечивающий шифрование SSL на стороне клиента, например, в Интернете, и иметь незашифрованное соединение с приложением. Это также дает вам больше свободы для отладки ответов вашего приложения.

Еще одна вещь, о которой упоминал Дейв Чейни, - это использовать собственный разъем Tomcat для балансировки нагрузки и других функций.


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

0

Вам действительно нужен прокси для службы HTTPS? Возможно, вы захотите прокси для службы не-ssl в 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. Поэтому я использую виртуальные хосты на основе IP, чтобы все выглядело так, как будто каждое веб-приложение размещено на своем собственном сервере. Я протестировал следующую команду wget, и она отлично работает: wget localhost: 8443 --no -check-certificate
JMD

2
Обратите внимание - это просто, чтобы добавить дополнительные IP-адреса на ваш сервер, и, таким образом, несколько приложений прослушивают порт 443 - все на разных IP-адресах.
Brent

0

Проверьте журнал ошибок SSL и убедитесь, что у вас нет ошибок, связанных с невозможностью проверки цепочки сертификатов CA.


Если действительно есть ошибки проверки, каково было бы решение?
Хавьер Мендес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.