Назад | Перейти на главную страницу

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

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

Как я могу заставить это работать?

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

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

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

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

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

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

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

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

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

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

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

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

Проверьте журнал ошибок SSL и убедитесь, что у вас нет ошибок о невозможности проверить цепочку сертификатов ЦС.