%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20openssl%20%D0%BD%D0%B0%20%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8%200%20%D0%B2%20Ubuntu%2022.04%3F.png)
У меня установлен 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?