Instalei o ansible em um host com Ubuntu 22.04, a partir do qual tento me conectar a um host com Windows Server 2012 R2 usando winrm. O problema é que recebo um erro de conexão.
Depois de perseguir o erro por várias horas, descobri o motivo:
- Usandosslscan(com a
--show-sigs
opção) descobri que o host do Windows aceita apenas orsa_pkcs1-sha1
algoritmo de assinatura do servidor (até onde investiguei, entendo que esse algoritmo é usado durante a troca de chaves e não tem nada a ver com os algoritmos de assinatura relacionados ao certificado). Estou tentado a dizer que esse é o comportamento normal do Windows Server 2012 R2, mas não sou um especialista em Windows para ter certeza disso. - O Ubuntu 22.04 vem com o openssl 3.0.2 configurado por padrão no seclevel 2. Pelo que entendi, o openssl com essa versão e nesse seclevel não faz uso de nenhum algoritmo que use SHA1. Isso significa que, durante o handshake TLS com o host do Windows, o openssl nunca apresenta o
rsa_pkcs1-sha1
algoritmo como um algoritmo suportado na lista subscription_algorithms do Client Hello (confirmei isso com o Wireshark). - Como o host do Windows Server 2012 R2 só entende
rsa_pkcs1-sha1
, mas não é apresentado no Client Hello então a única coisa que o host pode fazer é encerrar a conexão, deixando a seguinte mensagem no Visualizador de Eventos:Uma solicitação de conexão TLS 1.2 foi recebida de um aplicativo cliente remoto, mas nenhum dos conjuntos de criptografia suportados pelo aplicativo cliente é compatível com o servidor. Observe que a mensagem é meio enganosa porque não há nenhum problema com os conjuntos de criptografia. O problema está nos algoritmos de assinatura para a troca de chaves.
Com essas informações em mãos, decidi fazer o downgrade do seclevel do openssl de 2 para 0. Seclevel 0 significa que o openssl se comportará como as versões anteriores do openssl (que em particular permitiam SHA1). Consegui confirmar, usando o openssl s_client
comando e o Wireshark, que essa alteração permitiu que o openssl se conectasse ao host do Windows porque, no seclevel 0, o openssl de fato inclui o rsa_pkcs1-sha1
algoritmo na lista de subscription_algorithms do Client Hello.
O problema agora é que, mesmo /etc/ssl/openssl.cnf
configurado no seclevel 0, o ansible ainda não é capaz de se conectar ao host do Windows. Meu palpite é que o ansible faz uso de algum wrapper python do openssl que ignora /etc/ssl/openssl.cnf
completamente o arquivo de configuração. Portanto, a questão é: como posso forçar o ansible (ou python) a usar o openssl no seclevel 0?