Warum scheint das Zertifikat, das ich erhalte, zu variieren, wenn ich eine Verbindung zu einem Host über Shared Hosting Python

Python-Programme
Guest
 Warum scheint das Zertifikat, das ich erhalte, zu variieren, wenn ich eine Verbindung zu einem Host über Shared Hosting

Post by Guest »

Ich habe ein Python 3.11.9-Skript, das Zeep verwendet (das unter der Haube Anfragen verwendet), um eine Verbindung zu einem SOAP-Endpunkt herzustellen, der auf Azure läuft. Es ist nicht ungewöhnlich, dass ich eine .crt-Datei für das zugrunde liegende Session()-Objekt bereitstellen musste, da mein Arbeitgeber über eine Appliance verfügt, die SSL/TLS abfängt und Intranet-Hosts ein selbstsigniertes Zertifikat bereitstellt.
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 ich zu verstehen glaube, ist:
  • 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
Was aufgrund all dessen nicht meinen Erwartungen entspricht, ist der Grund, warum es offenbar variabel ist, welches Zertifikat zurückkommt, und nicht irgendein willkürlicher Standardwert. Anders ausgedrückt: Wenn SNI in dieser Bibliothek nicht implementiert ist, würde ich davon ausgehen, dass es immer fehlschlägt, und wenn es ist, würde ich davon ausgehen, dass es immer funktioniert.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post