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