Вопрос или проблема
У нас есть два сервера, которые находятся в разных сетях. Мы хотим иметь ssl-связь от клиента к фронтэнду и от фронтэнда к бэкенду.
Фронтенд может принимать и завершать ssl-трафик, связь ssl на бэкенде не происходит, с следующей ошибкой:
“Серверные узлы/web02 отключены, причина: некорректный ответ Layer6, информация: “ошибка SSL рукопожатия”, время проверки: 546 мс “
Конфигурационный файл haproxy:
global
log 127.0.0.1 local1 debug
maxconn 4000
daemon
uid 99
gid 99
stats socket /tmp/haproxy.stats level admin
defaults
mode http
log global
option forwardfor
option http-server-close
timeout server 5s
timeout connect 5s
timeout client 5s
frontend www-https
bind <Ip-address>:443 ssl crt /home/user/SSL/domain-name.in.pem
reqadd X-Forwarded-Proto:\ https
default_backend nodes
backend nodes
balance roundrobin
cookie JSESSIONID prefix indirect nocache
server web01 <IP-address>:8443 ssl verify none check cookie web01
server web02 <IP-address>:8443 ssl crt /home/SSL/domain-name.in.pem ca-file /home/SSL/gdig2.crt verify required check cookie web02
Любая помощь в этом будет очень признательна
Мы хотим иметь ssl-связь от … фронтэнда к бэкенду
Это не имеет смысла: между фронтендом haproxy и бэкендом haproxy нет TCP-соединения. Это логическое отображение, внутреннее для процесса haproxy. Ваша фактическая настройка TLS бэкенда осуществляется на самом сервере бэкенда <IP-address>:8443
для web02
.
Таким образом, ошибка SSL handshake failure
, которую вы получаете, возникает из-за того, что HAproxy не может подтвердить сертификат web02, используя данный сертификат ca-file
. Либо ваша клиентская аутентификация не проходит (та, которая указана через server web02 ... ssl crt ...
). Посмотрев на строку бэкенда:
server web02 <IP-address>:8443 ssl crt /home/SSL/domain-name.in.pem ca-file /home/SSL/gdig2.crt verify required check cookie web02
Вы уверены, что намеревались использовать клиентскую аутентификацию? Если да, пожалуйста, проверьте ваш клиентский сертификат: мне очень необычно использовать один и тот же сертификат для клиентской аутентификации, который вы также используете для обслуживания TLS в своем специфицированном фронтенде haproxy (/home/SSL/domain-name.in.pem
).
Ответ или решение
Аргументы по проблеме "Сервер backend недоступен из-за неправильного ответа на уровне 6: сбой SSL-рукопожатия в HAProxy"
Введение
Настройка безопасной связи между клиентом и сервером с использованием прокси-сервера HAProxy часто сопровождается проблемами, связанными с процессом SSL-рукопожатия. Ошибка, упомянутая вами – "Layer 6 invalid response, info: SSL handshake failure" – указывает на то, что HAProxy не может установить безопасное соединение с бэкенд-сервером. Давайте детально проанализируем вашу конфигурацию и возможные причины возникновения данной ошибки.
Анализ конфигурации
-
SSL-терминация и настройки HAProxy:
- В вашем конфигурационном файле HAProxy указано, что фронтэнд принимает SSL-трафик, а бэкенд также настроен для работы через SSL, используя адреса серверов на порту 8443. Важно отметить, что на бэкенде сертификаты должны быть настроены корректно, чтобы HAProxy мог их проверить.
-
Верификация сертификатов:
- В строке конфигурации сервера
web02
указаноverify required
, что требует обязательной верификации сертификатов. Это значит, что HAProxy будет проверять, действительно ли сертификатweb02
подписан удостоверяющим центром (CA), указанным вca-file /home/SSL/gdig2.crt
. - Если сертификат
web02
не соответствует ожидаемому CA, это приведет к сбою рукопожатия SSL и, как следствие, к статусуDOWN
для этого сервера.
- В строке конфигурации сервера
-
Клиентская аутентификация:
- Ваша конфигурация для
web02
также пытается использовать клиентский сертификат (crt /home/SSL/domain-name.in.pem
). Убедитесь, что сертификат, используемый для клиентской аутентификации, корректен и соответствует требованиям бэкенд-сервера. Как правило, клиентский сертификат отличается от сертификата, используемого для обеспечения TLS на фронтэнде и бэкенде.
- Ваша конфигурация для
-
Настройки бэкенда:
- Проверьте, действительно ли бэкенд-сервер
web02
слушает на порту 8443 и может принимать запросы. Использование инструментов вродеcurl
для тестирования соединения может помочь в диагностике.
- Проверьте, действительно ли бэкенд-сервер
Рекомендации по устранению неполадок
-
Проверьте сертификаты:
- Убедитесь, что сертификат, установленный на
web02
, является действительным и подписан корректным удостоверяющим центром, указанным вca-file
. Используйте командуopenssl s_client -connect <IP-address>:8443 -CAfile /home/SSL/gdig2.crt
для тестирования SSL-соединения.
- Убедитесь, что сертификат, установленный на
-
Перепроверьте конфигурацию:
- Убедитесь, что необходимо ли использовать клиентскую аутентификацию для
web02
. Если это не требуется, уберите параметрcrt
из конфигурации.
- Убедитесь, что необходимо ли использовать клиентскую аутентификацию для
-
Логи и отладка:
- Увеличьте уровень логирования в секции
global
доdebug
и просмотрите логи HAProxy для получения более подробной информации о сбое.
- Увеличьте уровень логирования в секции
-
Рассмотрите возможность использования
ssl backend
:- Убедитесь, что вы правильно настроили все параметры для работы с HTTPS на бэкенде. Проверьте, поддерживает ли ваш сервер на
8443
сертификаты, которые он ожидает получить.
- Убедитесь, что вы правильно настроили все параметры для работы с HTTPS на бэкенде. Проверьте, поддерживает ли ваш сервер на
Заключение
Ошибки, связанные с SSL-рукопожатием, могут быть вызваны различными факторами, включая неправильные сертификаты, отсутствие необходимых ключей или неверные конфигурации серверов. Внимательно проанализировав ваш текущий конфигурационный файл и следуя приведенным выше рекомендациям, вы сможете устранить возникшие проблемы и восстановить стабильную работу вашего HAProxy.