Ich habe Ansible auf einem Host mit Ubuntu 22.04 installiert, von dem aus ich versuche, mithilfe von winrm eine Verbindung zu einem Host mit Windows Server 2012 R2 herzustellen. Das Problem ist, dass ich einen Verbindungsfehler erhalte.
Nachdem ich mehrere Stunden lang dem Fehler nachgejagt hatte, fand ich die Ursache:
- Verwenden vonSSL-Scan(mit der
--show-sigs
Option) Ich habe festgestellt, dass der Windows-Host nur denrsa_pkcs1-sha1
Serversignaturalgorithmus akzeptiert (soweit ich das untersucht habe, wird dieser Algorithmus beim Schlüsselaustausch verwendet und hat nichts mit den Signaturalgorithmen zu tun, die mit dem Zertifikat in Zusammenhang stehen). Ich bin versucht zu sagen, dass dies das normale Verhalten von Windows Server 2012 R2 ist, aber ich bin kein Windows-Experte, um mir dessen sicher zu sein. - Ubuntu 22.04 wird mit OpenSSL 3.0.2 ausgeliefert, das standardmäßig auf Sicherheitsebene 2 konfiguriert ist. Soweit ich weiß, verwendet OpenSSL mit dieser Version und auf dieser Sicherheitsebene keinen Algorithmus, der SHA1 verwendet. Dies bedeutet, dass OpenSSL während des TLS-Handshakes mit dem Windows-Host den
rsa_pkcs1-sha1
Algorithmus niemals als unterstützten Algorithmus in der Liste „signature_algorithms“ des Client Hello anzeigt (ich habe dies mit Wireshark bestätigt). - Da der Windows Server 2012 R2-Host nur versteht
rsa_pkcs1-sha1
, es aber nicht im Client Hello angezeigt wird, kann der Host nur die Verbindung beenden und die folgende Meldung in der Ereignisanzeige hinterlassen:Von einer Remote-Client-Anwendung wurde eine TLS 1.2-Verbindungsanforderung empfangen, aber keine der von der Client-Anwendung unterstützten Verschlüsselungssammlungen wird vom Server unterstützt.. Beachten Sie, dass die Nachricht etwas irreführend ist, da es überhaupt kein Problem mit den Verschlüsselungssammlungen gibt. Das Problem liegt in den Signaturalgorithmen für den Schlüsselaustausch.
Mit diesen Informationen habe ich beschlossen, den Sicherheitslevel von OpenSSL von 2 auf 0 herunterzustufen. Sicherheitslevel 0 bedeutet, dass sich OpenSSL wie frühere Versionen von OpenSSL verhält (die insbesondere SHA1 zuließen). Mithilfe des Befehls und Wireshark konnte ich bestätigen, dass diese Änderung OpenSSL die Verbindung zum Windows-Host ermöglichte, da OpenSSL auf Sicherheitslevel 0 den Algorithmus tatsächlich in die Liste der Signaturalgorithmen des Client Hello openssl s_client
aufnimmt .rsa_pkcs1-sha1
Das Problem besteht nun darin, dass Ansible trotz /etc/ssl/openssl.cnf
der Konfiguration auf Sicherheitsebene 0 immer noch keine Verbindung zum Windows-Host herstellen kann. Ich vermute, dass Ansible einen Python-Wrapper von OpenSSL verwendet, der die /etc/ssl/openssl.cnf
Konfigurationsdatei vollständig umgeht. Die Frage ist also: Wie kann ich Ansible (oder Python) zwingen, OpenSSL auf Sicherheitsebene 0 zu verwenden?