У меня установлен ansible на хосте с Ubuntu 22.04, с которого я пытаюсь подключиться к хосту с Windows Server 2012 R2 с помощью winrm. Проблема в том, что я получаю ошибку подключения.
После нескольких часов поиска ошибки я нашел причину:
- С использованиемsslscan(с
--show-sigs
опцией) Я обнаружил, что хост Windows принимает толькоrsa_pkcs1-sha1
алгоритм подписи сервера (насколько я знаю, этот алгоритм используется во время обмена ключами и не имеет ничего общего с алгоритмами подписи, связанными с сертификатом). Мне хочется сказать, что это нормальное поведение Windows Server 2012 R2, но я не эксперт по Windows, чтобы быть в этом уверенным. - Ubuntu 22.04 поставляется с openssl 3.0.2, настроенным по умолчанию на уровне seclevel 2. Насколько я понимаю, openssl с этой версией и на этом уровне seclevel не использует ни один алгоритм, использующий SHA1. Это означает, что во время рукопожатия TLS с хостом Windows openssl никогда не представляет алгоритм
rsa_pkcs1-sha1
как поддерживаемый в списке signature_algorithms Client Hello (я подтвердил это с помощью Wireshark). - Поскольку хост Windows Server 2012 R2 понимает только
rsa_pkcs1-sha1
, но не отображается в Client Hello, то единственное, что может сделать хост, — это разорвать соединение, оставив в средстве просмотра событий следующее сообщение:От удаленного клиентского приложения получен запрос на соединение TLS 1.2, но ни один из поддерживаемых клиентским приложением наборов шифров не поддерживается сервером.. Обратите внимание, что сообщение вводит в заблуждение, поскольку никаких проблем с наборами шифров нет. Проблема заключается в алгоритмах подписи для обмена ключами.
Имея эту информацию под рукой, я решил понизить уровень безопасности openssl с 2 до 0. Уровень безопасности 0 означает, что openssl будет вести себя как предыдущие версии openssl (которые, в частности, допускали SHA1). Я смог подтвердить, используя команду openssl s_client
и Wireshark, что это изменение позволило openssl подключиться к хосту Windows, поскольку на уровне безопасности 0 openssl фактически включает алгоритм rsa_pkcs1-sha1
в список signature_algorithms Client Hello.
Проблема в том, что даже /etc/ssl/openssl.cnf
будучи настроенным на seclevel 0, ansible все еще не может подключиться к хосту Windows. Я предполагаю, что ansible использует какую-то оболочку python openssl, которая /etc/ssl/openssl.cnf
полностью обходит файл конфигурации. Поэтому вопрос в следующем: как заставить ansible (или python, если на то пошло) использовать openssl на seclevel 0?