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.

Как я могу сделать эту работу?

JMD
источник

Ответы:

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>
JMD
источник
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
Brendan
источник
В настоящее время мне не нужно использовать балансировку нагрузки, но это может быть ужасно в будущем. Спасибо за понимание.
JMD
1

Что я не понимаю, так это то, почему вам нужно иметь SSL-соединение от вашего apache к вашему приложению, которое, кажется, находится на той же машине ( http: // localhost: 8443 / ).

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

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

zero_r
источник
Ну, у меня есть две причины для выбора такой установки. Во-первых, сервер 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/
codehead
источник
Действительно использование SSL является для меня обязательным. Я также проверил прокси без использования SSL только для проверки, и он работает нормально. Поддержка SSL является реальной проблемой.
JMD
0

Сначала я посмотрю, можно ли сделать запрос с localhost на localhost: 8443 и посмотреть, успешно ли это (IE делает GET или wget http: // localhost: 8443 )

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

почему приложение не может просто использовать 443 изначально? если вы не можете изменить его, вы можете просто использовать iptables для перенаправления порта

Brendan
источник
Причина в том, что мне нужно установить больше веб-приложений на одном сервере, все с использованием SSL, и они не могут все слушать порт 443. Поэтому я использую виртуальные хосты на основе IP, чтобы все выглядело так, как будто каждое веб-приложение размещено на своем собственном сервере. Я протестировал следующую команду wget, и она отлично работает: wget localhost: 8443 --no -check-certificate
JMD
2
Обратите внимание - это просто, чтобы добавить дополнительные IP-адреса на ваш сервер, и, таким образом, несколько приложений прослушивают порт 443 - все на разных IP-адресах.
Brent
0

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

Neobyte
источник
Если действительно есть ошибки проверки, каково было бы решение?
Хавьер Мендес