Tengo ansible instalado en un host con Ubuntu 22.04, desde el cual intento conectarme a un host con Windows Server 2012 R2 usando winrm. El problema es que me sale un error de conexión.
Después de perseguir el error durante varias horas encontré el motivo:
- Usandoescaneo ssl(con la
--show-sigs
opción) Descubrí que el host de Windows solo acepta elrsa_pkcs1-sha1
algoritmo de firma del servidor (hasta donde he investigado, entiendo que este algoritmo se usa durante el intercambio de claves y no tiene nada que ver con los algoritmos de firma relacionados con el certificado). Me siento tentado a decir que este es el comportamiento normal de Windows Server 2012 R2, pero no soy un experto en Windows para estar seguro de eso. - Ubuntu 22.04 viene con openssl 3.0.2 configurado de forma predeterminada en el nivel de segundo 2. Hasta donde tengo entendido, openssl con esa versión y en ese nivel de segundo no utiliza ningún algoritmo que use SHA1. Esto significa que, durante el protocolo de enlace TLS con el host de Windows, openssl nunca presenta el
rsa_pkcs1-sha1
algoritmo como un algoritmo compatible en la lista de algoritmos de firma del Hola del cliente (lo confirmé con Wireshark). - Dado que el host de Windows Server 2012 R2 solo entiende
rsa_pkcs1-sha1
, pero no se presenta en Client Hello, lo único que puede hacer el host es finalizar la conexión, dejando el siguiente mensaje en el Visor de eventos:Se recibió una solicitud de conexión TLS 1.2 desde una aplicación cliente remota, pero el servidor no admite ninguno de los conjuntos de cifrado admitidos por la aplicación cliente.. Tenga en cuenta que el mensaje es un poco engañoso porque no hay ningún problema con los conjuntos de cifrado. El problema radica en los algoritmos de firma para el intercambio de claves.
Con esta información a mano, decidí degradar el nivel de segundo de openssl de 2 a 0. Nivel de segundo 0 significa que openssl se comportará como versiones anteriores de openssl (que en particular permitían SHA1). Pude confirmar, usando el openssl s_client
comando y Wireshark, que este cambio permitió que openssl se conectara al host de Windows porque, en el nivel de sección 0, openssl de hecho incluye el rsa_pkcs1-sha1
algoritmo en la lista de algoritmos de firma del Cliente Hola.
El problema ahora es que, incluso si /etc/ssl/openssl.cnf
está configurado en el nivel 0, ansible todavía no es capaz de conectarse al host de Windows. Supongo que ansible utiliza algún contenedor Python de openssl que omite el /etc/ssl/openssl.cnf
archivo de configuración por completo. Entonces la pregunta es: ¿cómo puedo forzar a ansible (o python) a usar openssl en el nivel 0?