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

Использование Https между Apache Loadbalancer и бэкэндами

Я использую сервер apache (2.4), настроенный как балансировщик нагрузки, перед двумя серверами apache. Он отлично работает, когда я использую http-соединения между loadbalancer и бэкэндами, однако использование https не работает. Конфигурация балансировщика:

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
<Proxy balancer://testcluster>
  BalancerMember https://[Backend1]:443/test
  BalancerMember https://[Backend2]:443/test
</Proxy>
ProxyPass /test balancer://testcluster

На данный момент у бэкэндов есть только самозаверяющие сертификаты, поэтому проверка сертификатов отключена.

Журнал ошибок балансировщика нагрузки содержит следующее:

[proxy:error] [pid 31202:tid 140325875570432] (502)Unknown error 502: [client ...] AH01084: pass request body failed to [Backend1]:443 ([Backend1])
[proxy:error] [pid 31202:tid 140325875570432] [client ...] AH00898: Error during SSL Handshake with remote server returned by /test/test.jsp
[proxy_http:error] [pid 31202:tid 140325875570432] [client ...] AH01097: pass request body failed to [Backend1]:443 ([Backend1]) from [...] ()

Страница ошибки в браузере содержит:

Proxy Error

The proxy server could not handle the request GET /test/test.jsp.
Reason: Error during SSL Handshake with remote server

Как я уже сказал выше, изменение конфигурации на протокол http и порт 80 работает. Также работают https-соединения между клиентом и балансировщиком нагрузки, поэтому кажется, что модуль ssl балансировщика настроен правильно. Подключение напрямую к бэкэнду по https тоже не вызывает ошибок.

Спасибо заранее за ваше время


Edit: I figured it out, the problem is that my certificates common name does not match the server name. I thought SSLProxyVerify нет would cause this mismatch to be ignored, but it doesn't. Prior to apache 2.4.5 this check can be disabled using SSLProxyCheckPeerCN выключен but on higher versions (I am using 2.4.7) SSLProxyCheckPeerName выключен also needs to be specified.

Документация Apache для sslproxycheckpeername

Рабочая конфигурация выглядит так:

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

<Proxy balancer://testcluster>
  BalancerMember https://[backend1]:443/test
  BalancerMember https://[backend1]:443/test
</Proxy>
ProxyPass /test balancer://testcluster

К сожалению, я не могу ответить на свой вопрос из-за отсутствия репутации, поэтому я отредактировал свой вопрос, надеюсь, это поможет любому, кто сталкивается с подобной проблемой.

Проблема оказалась в том, что общее имя сертификатов не совпадало с именем сервера.

До Apache 2.4.5 эту проверку можно было отключить с помощью SSLProxyCheckPeerCN off но на более высоких версиях (например, 2.4.7) SSLProxyCheckPeerName off также необходимо указать.

Документация Apache для SSLProxyCheckPeerName

Рабочая конфигурация выглядит так:

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

<Proxy balancer://testcluster>
  BalancerMember https://[backend1]:443/test
  BalancerMember https://[backend1]:443/test
</Proxy>
ProxyPass /test balancer://testcluster

Ты можешь проверьте версию Apache, которая у вас установлена с участием:

apachectrl -V

Добавление ниже решило проблему

SSLProxyProtocol +TLSv1

Я использую apache 2.4.9 и добавляю в httpd-ssl.conf следующий код

SSLProxyProtocol + SSLv3 + TLSv1 + TLSv1.1

я решил проблемы