it-swarm-ru.tech

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

Я пытаюсь настроить сервер с несколькими веб-приложениями, которые будут обслуживаться через 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:844 доступно, 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:844 :

"GET / HTTP/1.1" 302

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

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

28
JMD

Наконец-то я нашел способ заставить его работать. Сначала я попробовал предложение Дейва Чейни, поэтому я установил другой сертификат для сервера 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>
35
JMD

Попробуйте этот конфиг

<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.

4
Dave Cheney

Но если ваша цель - запустить несколько веб-приложений с поддержкой 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
2
Brendan

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

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

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

1
zero_r

Вам действительно нужен прокси для службы HTTPS? Возможно, вы захотите использовать прокси для службы не-ssl в localhost, например,.

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
0
codehead

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

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

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

0
Brendan

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

0
Neobyte