Das hat alles gut funktioniert, als ich etwa eine Woche lang getestet habe, aber gestern begann die TLS-Verbindung zu scheitern, als ob die .crt-Datei das aus dem Verbindungsversuch erhaltene Zertifikat nicht validiert hätte, und tatsächlich wurde beim Hochfahren eines Testskripts Folgendes festgestellt Ich habe eine Bescheinigung über einen zurückbekommen Azure-Domäne, nicht die Domäne, zu der ich eine Verbindung herstellte, und ohne die Anzeichen einer selbstsignierten Appliance.
Dann (nach der unten beschriebenen Recherche) begann es rätselhafterweise zu funktionieren wieder; Das heißt, das zurückkommende Zertifikat entsprach wieder meinen Erwartungen und es wird alles validiert.
Ich habe ein Testskript (unten) basierend auf einigen Suchvorgängen und Beispielen von SO erstellt, um eine Verbindung herzustellen und abzurufen das Zertifikat, damit ich sehen konnte, was los ist. Was ich herausfand, war, dass ich anscheinend ein Zertifikat für die Azure-„Seite“ (ich bin mir nicht sicher, der richtige Begriff) und nicht für die Domäne des Anbieters erhielt.
Dies führte zu einer Recherche zu TLS, Servername Hinweise und andere Dinge, und ich versuche herauszufinden, ob SNI in meiner Python-Version unterstützt wird (3.11, also glaube ich ja an die stdlib und „es kommt darauf an“ in Bibliotheken.)
Leider mache ich das beruflich Daher kann ich weder den tatsächlichen Code noch den betreffenden Hostnamen angeben. Hoffentlich reicht die Erklärung aus.
Code: Select all
import socket
from OpenSSL import SSL
import certifi
port = 443
hostname = 'some site'
context = SSL.Context(method=SSL.TLS_CLIENT_METHOD)
context.load_verify_locations(cafile=certifi.where())
conn = SSL.Connection(context, socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM))
conn.settimeout(5)
#Comment out set_tlsext_host_name() to break
conn.set_tlsext_host_name(hostname.encode())
conn.connect((hostname, port))
conn.setblocking(1)
conn.do_handshake()
print('\n')
for (idx, cert) in enumerate(conn.get_peer_cert_chain()):
subject = cert.get_subject()
issued_to = subject.CN # the Common Name field
issuer = cert.get_issuer()
issued_by = issuer.CN
issued_org = issuer.O
issued_ou = issuer.OU
print('')
print(f'Cert {idx}')
print('Raw subject')
print(subject)
print('Raw issuer')
print(issuer)
conn.close()
- Was SNI leistet
- Dass es Unterstützung im SSL-Modul von Python 3.11 gibt
- Dass diese Unterstützung nicht unbedingt bedeutet, dass es in einer bestimmten Bibliothek implementiert ist
- Das Fehlen der SNI Erweiterung: In einem TLS-Hallo könnte ein Host ein Zertifikat für eine bestimmte Person zurückgeben Domäne, die es enthält
Obwohl ich davon ausgehe, dass die Frage nicht beantwortet werden kann, ohne mehr über die Infrastruktur meines Arbeitgebers zu wissen, stellt sich die Frage, warum das Azure-Zertifikat im Fall des Azure-Zertifikats nicht abgefangen und selbstsigniert wurde Netzwerkgerät.