ssl — TLS/SSL-Wrapper für Socket-Objekte¶
Quellcode: Lib/ssl.py
Dieses Modul bietet Zugriff auf Transport Layer Security (oft bekannt als „Secure Sockets Layer“) Verschlüsselungs- und Peer-Authentifizierungsfunktionen für Netzwerk-Sockets, sowohl auf Client- als auch auf Serverseite. Dieses Modul verwendet die OpenSSL-Bibliothek. Es ist auf allen modernen Unix-Systemen, Windows, macOS und wahrscheinlich zusätzlichen Plattformen verfügbar, solange OpenSSL auf dieser Plattform installiert ist.
Hinweis
Einige Verhaltensweisen können plattformabhängig sein, da Aufrufe an die Socket-APIs des Betriebssystems erfolgen. Die installierte Version von OpenSSL kann ebenfalls zu Variationen im Verhalten führen. Zum Beispiel kommt TLSv1.3 mit OpenSSL Version 1.1.1.
Warnung
Verwenden Sie dieses Modul nicht, ohne die Sicherheitsüberlegungen zu lesen. Andernfalls kann dies zu einem falschen Sicherheitsgefühl führen, da die Standardeinstellungen des ssl-Moduls nicht unbedingt für Ihre Anwendung geeignet sind.
Verfügbarkeit: nicht WASI.
Dieses Modul funktioniert nicht oder ist nicht auf WebAssembly verfügbar. Weitere Informationen finden Sie unter WebAssembly-Plattformen.
Dieser Abschnitt dokumentiert die Objekte und Funktionen im ssl-Modul; für allgemeinere Informationen über TLS, SSL und Zertifikate wird der Leser auf die Dokumente im Abschnitt „Siehe auch“ unten verwiesen.
Dieses Modul bietet eine Klasse, ssl.SSLSocket, die von der socket.socket-Klasse abgeleitet ist und einen Socket-ähnlichen Wrapper bereitstellt, der die Daten, die über den Socket gehen, mit SSL verschlüsselt und entschlüsselt. Er unterstützt zusätzliche Methoden wie getpeercert(), die das Zertifikat der Gegenseite der Verbindung abrufen, cipher(), die den für die sichere Verbindung verwendeten Cipher abruft, oder get_verified_chain(), get_unverified_chain(), die die Zertifikatskette abrufen.
Für anspruchsvollere Anwendungen hilft die Klasse ssl.SSLContext bei der Verwaltung von Einstellungen und Zertifikaten, die dann von SSL-Sockets, die über die Methode SSLContext.wrap_socket() erstellt wurden, geerbt werden können.
Geändert in Version 3.5.3: Aktualisiert zur Unterstützung der Verlinkung mit OpenSSL 1.1.0
Geändert in Version 3.6: OpenSSL 0.9.8, 1.0.0 und 1.0.1 sind veraltet und werden nicht mehr unterstützt. Zukünftig wird das ssl-Modul mindestens OpenSSL 1.0.2 oder 1.1.0 benötigen.
Geändert in Version 3.10: PEP 644 wurde implementiert. Das ssl-Modul benötigt OpenSSL 1.1.1 oder neuer.
Die Verwendung veralteter Konstanten und Funktionen führt zu Warnungen über veraltete Funktionen.
Funktionen, Konstanten und Ausnahmen¶
Socket-Erstellung¶
Instanzen von SSLSocket müssen mit der Methode SSLContext.wrap_socket() erstellt werden. Die Hilfsfunktion create_default_context() gibt einen neuen Kontext mit sicheren Standardeinstellungen zurück.
Beispiel für einen Client-Socket mit Standardkontext und IPv4/IPv6 Dual-Stack
import socket
import ssl
hostname = 'www.python.org'
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Beispiel für einen Client-Socket mit benutzerdefiniertem Kontext und IPv4
hostname = 'www.python.org'
# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Beispiel für einen Server-Socket, der auf localhost IPv4 lauscht
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
sock.bind(('127.0.0.1', 8443))
sock.listen(5)
with context.wrap_socket(sock, server_side=True) as ssock:
conn, addr = ssock.accept()
...
Kontext-Erstellung¶
Eine Komfortfunktion hilft bei der Erstellung von SSLContext-Objekten für gängige Zwecke.
- ssl.create_default_context(purpose=Purpose.SERVER_AUTH, *, cafile=None, capath=None, cadata=None)¶
Gibt ein neues
SSLContext-Objekt mit Standardeinstellungen für den angegebenen Zweck zurück. Die Einstellungen werden vomssl-Modul gewählt und stellen normalerweise eine höhere Sicherheit dar, als wenn derSSLContext-Konstruktor direkt aufgerufen wird.cafile, capath, cadata repräsentieren optionale CA-Zertifikate, denen für die Zertifikatsüberprüfung vertraut werden kann, wie in
SSLContext.load_verify_locations(). Wenn alle dreiNonesind, kann diese Funktion stattdessen den Standard-CA-Zertifikaten des Systems vertrauen.Die Einstellungen sind:
PROTOCOL_TLS_CLIENToderPROTOCOL_TLS_SERVER,OP_NO_SSLv2undOP_NO_SSLv3mit stark verschlüsselten Cipher-Suiten ohne RC4 und ohne nicht authentifizierte Cipher-Suiten. Das Übergeben vonSERVER_AUTHals Zweck setztverify_modeaufCERT_REQUIREDund lädt entweder CA-Zertifikate (wenn mindestens eines von cafile, capath oder cadata angegeben ist) oder verwendetSSLContext.load_default_certs(), um die Standard-CA-Zertifikate zu laden.Wenn
keylog_filenameunterstützt wird und die UmgebungsvariableSSLKEYLOGFILEgesetzt ist, aktiviertcreate_default_context()die Schlüsselprotokollierung.Die Standardeinstellungen für diesen Kontext umfassen
VERIFY_X509_PARTIAL_CHAINundVERIFY_X509_STRICT. Diese veranlassen die zugrunde liegende OpenSSL-Implementierung, sich mehr wie eine konforme Implementierung von RFC 5280 zu verhalten, auf Kosten einer geringen Inkompatibilität mit älteren X.509-Zertifikaten.Hinweis
Das Protokoll, die Optionen, der Cipher und andere Einstellungen können jederzeit ohne vorherige Veraltung auf restriktivere Werte geändert werden. Die Werte stellen ein gutes Gleichgewicht zwischen Kompatibilität und Sicherheit dar.
Wenn Ihre Anwendung bestimmte Einstellungen benötigt, sollten Sie einen
SSLContexterstellen und die Einstellungen selbst anwenden.Hinweis
Wenn Sie feststellen, dass bestimmte ältere Clients oder Server bei der Verbindung mit einem von dieser Funktion erstellten
SSLContexteine Fehlermeldung wie „Protocol or cipher suite mismatch“ erhalten, kann es daran liegen, dass sie nur SSL3.0 unterstützen, das von dieser Funktion mitOP_NO_SSLv3ausgeschlossen wird. SSL3.0 gilt allgemein als vollständig defekt. Wenn Sie diese Funktion weiterhin verwenden möchten, aber SSL 3.0-Verbindungen zulassen wollen, können Sie diese mit folgendem Befehl wieder aktivieren:ctx = ssl.create_default_context(Purpose.CLIENT_AUTH) ctx.options &= ~ssl.OP_NO_SSLv3
Hinweis
Dieser Kontext aktiviert standardmäßig
VERIFY_X509_STRICT, was vor RFC 5280 oder fehlerhafte Zertifikate, die die zugrunde liegende OpenSSL-Implementierung ansonsten akzeptieren würde, ablehnen kann. Obwohl die Deaktivierung nicht empfohlen wird, können Sie dies mit folgendem Befehl tun:ctx = ssl.create_default_context() ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
Hinzugefügt in Version 3.4.
Geändert in Version 3.4.4: RC4 wurde aus dem Standard-Cipher-String entfernt.
Geändert in Version 3.6: ChaCha20/Poly1305 wurde zum Standard-Cipher-String hinzugefügt.
3DES wurde aus dem Standard-Cipher-String entfernt.
Geändert in Version 3.8: Unterstützung für die Schlüsselprotokollierung an
SSLKEYLOGFILEwurde hinzugefügt.Geändert in Version 3.10: Der Kontext verwendet nun
PROTOCOL_TLS_CLIENToderPROTOCOL_TLS_SERVERanstelle des generischenPROTOCOL_TLS.Geändert in Version 3.13: Der Kontext verwendet nun
VERIFY_X509_PARTIAL_CHAINundVERIFY_X509_STRICTin seinen Standard-Verifizierungs-Flags.
Ausnahmen¶
- exception ssl.SSLError¶
Wird ausgelöst, um einen Fehler von der zugrunde liegenden SSL-Implementierung (derzeit bereitgestellt von der OpenSSL-Bibliothek) zu signalisieren. Dies deutet auf ein Problem in der überlagerten höheren Verschlüsselungs- und Authentifizierungsschicht der zugrunde liegenden Netzwerkverbindung hin. Dieser Fehler ist ein Subtyp von
OSError. Der Fehlercode und die Meldung vonSSLError-Instanzen werden von der OpenSSL-Bibliothek bereitgestellt.Geändert in Version 3.3:
SSLErrorwar früher ein Subtyp vonsocket.error.- library¶
Eine Zeichenkette, die das OpenSSL-Untermodul bezeichnet, in dem der Fehler aufgetreten ist, z. B.
SSL,PEModerX509. Der Bereich der möglichen Werte hängt von der OpenSSL-Version ab.Hinzugefügt in Version 3.3.
- reason¶
Eine Zeichenkette, die den Grund für diesen Fehler bezeichnet, z. B.
CERTIFICATE_VERIFY_FAILED. Der Bereich der möglichen Werte hängt von der OpenSSL-Version ab.Hinzugefügt in Version 3.3.
- exception ssl.SSLZeroReturnError¶
Eine Unterklasse von
SSLError, die ausgelöst wird, wenn versucht wird zu lesen oder zu schreiben und die SSL-Verbindung sauber geschlossen wurde. Beachten Sie, dass dies nicht bedeutet, dass die zugrunde liegende Verbindung (read TCP) geschlossen wurde.Hinzugefügt in Version 3.3.
- exception ssl.SSLWantReadError¶
Eine Unterklasse von
SSLError, die von einem nicht-blockierenden SSL-Socket ausgelöst wird, wenn versucht wird, Daten zu lesen oder zu schreiben, aber mehr Daten auf der zugrunde liegenden TCP-Verbindung empfangen werden müssen, bevor die Anforderung erfüllt werden kann.Hinzugefügt in Version 3.3.
- exception ssl.SSLWantWriteError¶
Eine Unterklasse von
SSLError, die von einem nicht-blockierenden SSL-Socket ausgelöst wird, wenn versucht wird, Daten zu lesen oder zu schreiben, aber mehr Daten auf der zugrunde liegenden TCP-Verbindung gesendet werden müssen, bevor die Anforderung erfüllt werden kann.Hinzugefügt in Version 3.3.
- exception ssl.SSLSyscallError¶
Eine Unterklasse von
SSLError, die ausgelöst wird, wenn ein Systemfehler bei der Erfüllung einer Operation an einem SSL-Socket auftritt. Leider gibt es keine einfache Möglichkeit, die ursprüngliche errno-Nummer abzufragen.Hinzugefügt in Version 3.3.
- exception ssl.SSLEOFError¶
Eine Unterklasse von
SSLError, die ausgelöst wird, wenn die SSL-Verbindung abrupt beendet wurde. Im Allgemeinen sollten Sie nicht versuchen, die zugrunde liegende Verbindung wiederzuverwenden, wenn dieser Fehler auftritt.Hinzugefügt in Version 3.3.
- exception ssl.SSLCertVerificationError¶
Eine Unterklasse von
SSLError, die ausgelöst wird, wenn die Zertifikatsüberprüfung fehlgeschlagen ist.Hinzugefügt in Version 3.7.
- verify_code¶
Eine numerische Fehlerzahl, die den Verifizierungsfehler angibt.
- verify_message¶
Eine menschenlesbare Zeichenkette des Verifizierungsfehlers.
- exception ssl.CertificateError¶
Ein Alias für
SSLCertVerificationError.Geändert in Version 3.7: Die Ausnahme ist jetzt ein Alias für
SSLCertVerificationError.
Zufallsgenerierung¶
- ssl.RAND_bytes(num, /)¶
Gibt num kryptographisch sichere Pseudo-Zufallsbytes zurück. Löst eine
SSLErroraus, wenn der PRNG nicht mit genügend Daten initialisiert wurde oder wenn die Operation vom aktuellen RAND-Verfahren nicht unterstützt wird.RAND_status()kann verwendet werden, um den Status des PRNG zu überprüfen, undRAND_add()kann zum Initialisieren des PRNG verwendet werden.Für fast alle Anwendungen ist
os.urandom()vorzuziehen.Lesen Sie den Wikipedia-Artikel, Kryptographisch sicherer Pseudozufallszahlengenerator (CSPRNG), um die Anforderungen an einen kryptographisch sicheren Generator zu erfahren.
Hinzugefügt in Version 3.3.
- ssl.RAND_status()¶
Gibt
Truezurück, wenn der SSL-Pseudo-Zufallszahlengenerator mit „genügend“ Zufälligkeit initialisiert wurde, und andernfallsFalse. Sie könnenssl.RAND_egd()undssl.RAND_add()verwenden, um die Zufälligkeit des Pseudo-Zufallszahlengenerators zu erhöhen.
- ssl.RAND_add(bytes, entropy, /)¶
Vermischen Sie die gegebenen Bytes mit dem SSL-Pseudo-Zufallszahlengenerator. Der Parameter entropy (ein Float) ist eine Untergrenze für die im String enthaltene Entropie (Sie können also immer
0.0verwenden). Lesen Sie RFC 1750 für weitere Informationen über Entropiequellen.Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.
Zertifikatsbehandlung¶
- ssl.cert_time_to_seconds(cert_time)¶
Gibt die Zeit in Sekunden seit dem Epoch zurück, gegeben den
cert_time-String, der das Datum „notBefore“ oder „notAfter“ aus einem Zertifikat im"%b %d %H:%M:%S %Y %Z"strptime-Format (C-Locale) darstellt.Hier ist ein Beispiel
>>> import ssl >>> timestamp = ssl.cert_time_to_seconds("Jan 5 09:34:43 2018 GMT") >>> timestamp 1515144883 >>> from datetime import datetime >>> print(datetime.utcfromtimestamp(timestamp)) 2018-01-05 09:34:43
„notBefore“- oder „notAfter“-Daten müssen GMT verwenden (RFC 5280).
Geändert in Version 3.5: Interpretiert die Eingabezeit als UTC-Zeit gemäß der Zeitzone „GMT“ im Eingabe-String. Zuvor wurde die lokale Zeitzone verwendet. Gibt eine Ganzzahl zurück (keine Sekundenbruchteile im Eingabeformat).
- ssl.get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout])¶
Gegeben die Adresse
addreines SSL-geschützten Servers als Paar (Hostname, Portnummer), ruft das Zertifikat des Servers ab und gibt es als PEM-codierten String zurück. Wennssl_versionangegeben ist, wird diese Version des SSL-Protokolls verwendet, um eine Verbindung zum Server herzustellen. Wenn ca_certs angegeben ist, sollte es sich um eine Datei handeln, die eine Liste von Stammzertifikaten enthält, im selben Format wie der Parameter cafile inSSLContext.load_verify_locations(). Der Aufruf versucht, das Serverzertifikat anhand dieses Satzes von Stammzertifikaten zu validieren, und schlägt fehl, wenn der Validierungsversuch fehlschlägt. Ein Timeout kann mit dem Parametertimeoutangegeben werden.Geändert in Version 3.3: Diese Funktion ist jetzt IPv6-kompatibel.
Geändert in Version 3.5: Die Standard-ssl_version wird von
PROTOCOL_SSLv3zuPROTOCOL_TLSgeändert, um maximale Kompatibilität mit modernen Servern zu gewährleisten.Geändert in Version 3.10: Der Parameter timeout wurde hinzugefügt.
- ssl.DER_cert_to_PEM_cert(der_cert_bytes)¶
Gibt ein Zertifikat als DER-codierten Byte-Blob zurück, und zwar eine PEM-codierte String-Version desselben Zertifikats.
- ssl.PEM_cert_to_DER_cert(pem_cert_string)¶
Gibt ein Zertifikat als ASCII-PEM-String zurück und zwar eine DER-codierte Byte-Sequenz desselben Zertifikats.
- ssl.get_default_verify_paths()¶
Gibt ein benanntes Tupel mit Pfaden zu den Standard-CA-Dateien und -Verzeichnissen von OpenSSL zurück. Die Pfade sind dieselben, die von
SSLContext.set_default_verify_paths()verwendet werden. Der Rückgabewert ist ein benanntes TupelDefaultVerifyPathscafile- aufgelöster Pfad zur CA-Datei oderNone, wenn die Datei nicht existiert,capath- aufgelöster Pfad zum CA-Verzeichnis oderNone, wenn das Verzeichnis nicht existiert,openssl_cafile_env- OpenSSLs Umgebungsschlüssel, der auf eine CA-Datei verweist,openssl_cafile- fest codierter Pfad zu einer CA-Datei,openssl_capath_env- OpenSSLs Umgebungsschlüssel, der auf ein CA-Verzeichnis verweist,openssl_capath- fest codierter Pfad zu einem CA-Verzeichnis
Hinzugefügt in Version 3.4.
- ssl.enum_certificates(store_name)¶
Ruft Zertifikate aus dem Windows-Systemzertifikatsspeicher ab. store_name kann
CA,ROOToderMYsein. Windows kann auch zusätzliche Zertifikatsspeicher bereitstellen.Die Funktion gibt eine Liste von Tupeln (cert_bytes, encoding_type, trust) zurück. Der encoding_type gibt die Codierung von cert_bytes an. Es handelt sich entweder um
x509_asnfür X.509 ASN.1-Daten oder umpkcs_7_asnfür PKCS#7 ASN.1-Daten. Trust gibt den Zweck des Zertifikats als Satz von OIDs oder genauTruean, wenn das Zertifikat für alle Zwecke vertrauenswürdig ist.Beispiel
>>> ssl.enum_certificates("CA") [(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}), (b'data...', 'x509_asn', True)]
Verfügbarkeit: Windows.
Hinzugefügt in Version 3.4.
- ssl.enum_crls(store_name)¶
Ruft CRLs aus dem Windows-Systemzertifikatsspeicher ab. store_name kann
CA,ROOToderMYsein. Windows kann auch zusätzliche Zertifikatsspeicher bereitstellen.Die Funktion gibt eine Liste von Tupeln (cert_bytes, encoding_type, trust) zurück. Der encoding_type gibt die Codierung von cert_bytes an. Es handelt sich entweder um
x509_asnfür X.509 ASN.1-Daten oder umpkcs_7_asnfür PKCS#7 ASN.1-Daten.Verfügbarkeit: Windows.
Hinzugefügt in Version 3.4.
Konstanten¶
Alle Konstanten sind jetzt
enum.IntEnum- oderenum.IntFlag-Sammlungen.Hinzugefügt in Version 3.6.
- ssl.CERT_NONE¶
Möglicher Wert für
SSLContext.verify_mode. Mit Ausnahme vonPROTOCOL_TLS_CLIENTist dies der Standardmodus. Bei clientseitigen Sockets wird fast jedes Zertifikat akzeptiert. Validierungsfehler, wie z. B. nicht vertrauenswürdige oder abgelaufene Zertifikate, werden ignoriert und brechen den TLS/SSL-Handshake nicht ab.Im Servermodus wird vom Client kein Zertifikat angefordert, sodass der Client keines für die Client-Zertifikatsauthentifizierung sendet.
Siehe die Diskussion der Sicherheitsüberlegungen unten.
- ssl.CERT_OPTIONAL¶
Möglicher Wert für
SSLContext.verify_mode. Im Clientmodus hatCERT_OPTIONALdieselbe Bedeutung wieCERT_REQUIRED. Es wird empfohlen, stattdessenCERT_REQUIREDfür clientseitige Sockets zu verwenden.Im Servermodus wird eine Client-Zertifikatsanforderung an den Client gesendet. Der Client kann die Anforderung entweder ignorieren oder ein Zertifikat senden, um eine TLS-Client-Zertifikatsauthentifizierung durchzuführen. Wenn der Client ein Zertifikat sendet, wird es überprüft. Jeder Verifizierungsfehler bricht sofort den TLS-Handshake ab.
Die Verwendung dieser Einstellung erfordert, dass ein gültiger Satz von CA-Zertifikaten an
SSLContext.load_verify_locations()übergeben wird.
- ssl.CERT_REQUIRED¶
Möglicher Wert für
SSLContext.verify_mode. In diesem Modus sind Zertifikate von der anderen Seite der Socket-Verbindung erforderlich; eineSSLErrorwird ausgelöst, wenn kein Zertifikat bereitgestellt wird oder die Validierung fehlschlägt. Dieser Modus ist nicht ausreichend, um ein Zertifikat im Client-Modus zu verifizieren, da er Hostnamen nicht abgleicht.check_hostnamemuss ebenfalls aktiviert sein, um die Authentizität eines Zertifikats zu überprüfen.PROTOCOL_TLS_CLIENTverwendetCERT_REQUIREDund aktiviertcheck_hostnamestandardmäßig.Bei einem Server-Socket bietet dieser Modus eine zwingende TLS-Client-Zertifikatsauthentifizierung. Eine Client-Zertifikatanforderung wird an den Client gesendet und der Client muss ein gültiges und vertrauenswürdiges Zertifikat bereitstellen.
Die Verwendung dieser Einstellung erfordert, dass ein gültiger Satz von CA-Zertifikaten an
SSLContext.load_verify_locations()übergeben wird.
- class ssl.VerifyMode¶
enum.IntEnumSammlung von CERT_* Konstanten.Hinzugefügt in Version 3.6.
- ssl.VERIFY_DEFAULT¶
Möglicher Wert für
SSLContext.verify_flags. In diesem Modus werden Zertifikatssperrlisten (CRLs) nicht überprüft. Standardmäßig erfordert und verifiziert OpenSSL keine CRLs.Hinzugefügt in Version 3.4.
- ssl.VERIFY_CRL_CHECK_LEAF¶
Möglicher Wert für
SSLContext.verify_flags. In diesem Modus wird nur das Peer-Zertifikat überprüft, aber keine der zwischengeschalteten CA-Zertifikate. Der Modus erfordert eine gültige CRL, die vom Aussteller des Peer-Zertifikats (seiner direkten Vorfahren-CA) signiert wurde. Wenn keine ordnungsgemäße CRL mitSSLContext.load_verify_locationsgeladen wurde, schlägt die Validierung fehl.Hinzugefügt in Version 3.4.
- ssl.VERIFY_CRL_CHECK_CHAIN¶
Möglicher Wert für
SSLContext.verify_flags. In diesem Modus werden CRLs aller Zertifikate in der Peer-Zertifikatkette überprüft.Hinzugefügt in Version 3.4.
- ssl.VERIFY_X509_STRICT¶
Möglicher Wert für
SSLContext.verify_flags, um Workarounds für fehlerhafte X.509-Zertifikate zu deaktivieren.Hinzugefügt in Version 3.4.
- ssl.VERIFY_ALLOW_PROXY_CERTS¶
Möglicher Wert für
SSLContext.verify_flags, um die Überprüfung von Proxy-Zertifikaten zu ermöglichen.Hinzugefügt in Version 3.10.
- ssl.VERIFY_X509_TRUSTED_FIRST¶
Möglicher Wert für
SSLContext.verify_flags. Er weist OpenSSL an, vertrauenswürdige Zertifikate bei der Erstellung der Vertrauenskette zur Validierung eines Zertifikats zu bevorzugen. Dieses Flag ist standardmäßig aktiviert.Hinzugefügt in Version 3.4.4.
- ssl.VERIFY_X509_PARTIAL_CHAIN¶
Möglicher Wert für
SSLContext.verify_flags. Er weist OpenSSL an, zwischengeschaltete CAs im Trust-Store als Trust-Anker zu behandeln, genauso wie selbstsignierte Root-CA-Zertifikate. Dies ermöglicht es, Zertifikate, die von einer zwischengeschalteten CA ausgestellt wurden, zu vertrauen, ohne der übergeordneten Root-CA vertrauen zu müssen.Hinzugefügt in Version 3.10.
- class ssl.VerifyFlags¶
enum.IntFlagSammlung von VERIFY_* Konstanten.Hinzugefügt in Version 3.6.
- ssl.PROTOCOL_TLS¶
Wählt die höchste Protokollversion aus, die sowohl vom Client als auch vom Server unterstützt wird. Trotz des Namens kann diese Option sowohl „SSL“- als auch „TLS“-Protokolle auswählen.
Hinzugefügt in Version 3.6.
Veraltet seit Version 3.10: TLS-Clients und -Server benötigen unterschiedliche Standardeinstellungen für sichere Kommunikation. Die generische TLS-Protokollkonstante ist zugunsten von
PROTOCOL_TLS_CLIENTundPROTOCOL_TLS_SERVERveraltet.
- ssl.PROTOCOL_TLS_CLIENT¶
Automatische Aushandlung der höchsten Protokollversion, die sowohl vom Client als auch vom Server unterstützt wird, und Konfiguration des Kontexts für Client-seitige Verbindungen. Das Protokoll aktiviert standardmäßig
CERT_REQUIREDundcheck_hostname.Hinzugefügt in Version 3.6.
- ssl.PROTOCOL_TLS_SERVER¶
Automatische Aushandlung der höchsten Protokollversion, die sowohl vom Client als auch vom Server unterstützt wird, und Konfiguration des Kontexts für Server-seitige Verbindungen.
Hinzugefügt in Version 3.6.
- ssl.PROTOCOL_SSLv23¶
Alias für
PROTOCOL_TLS.Veraltet seit Version 3.6: Verwenden Sie stattdessen
PROTOCOL_TLS.
- ssl.PROTOCOL_SSLv3¶
Wählt SSL Version 3 als Kanalverschlüsselungsprotokoll.
Dieses Protokoll ist nicht verfügbar, wenn OpenSSL mit der Option
no-ssl3kompiliert wurde.Warnung
SSL Version 3 ist unsicher. Seine Verwendung wird dringend abgeraten.
Veraltet seit Version 3.6: OpenSSL hat alle versionsspezifischen Protokolle veraltet. Verwenden Sie stattdessen das Standardprotokoll
PROTOCOL_TLS_SERVERoderPROTOCOL_TLS_CLIENTmitSSLContext.minimum_versionundSSLContext.maximum_version.
- ssl.PROTOCOL_TLSv1¶
Wählt TLS Version 1.0 als Kanalverschlüsselungsprotokoll.
Veraltet seit Version 3.6: OpenSSL hat alle versionsspezifischen Protokolle veraltet.
- ssl.PROTOCOL_TLSv1_1¶
Wählt TLS Version 1.1 als Kanalverschlüsselungsprotokoll. Verfügbar nur mit openssl Version 1.0.1+.
Hinzugefügt in Version 3.4.
Veraltet seit Version 3.6: OpenSSL hat alle versionsspezifischen Protokolle veraltet.
- ssl.PROTOCOL_TLSv1_2¶
Wählt TLS Version 1.2 als Kanalverschlüsselungsprotokoll. Verfügbar nur mit openssl Version 1.0.1+.
Hinzugefügt in Version 3.4.
Veraltet seit Version 3.6: OpenSSL hat alle versionsspezifischen Protokolle veraltet.
- ssl.OP_ALL¶
Aktiviert Workarounds für verschiedene Bugs in anderen SSL-Implementierungen. Diese Option ist standardmäßig gesetzt. Sie setzt nicht unbedingt dieselben Flags wie die
SSL_OP_ALLKonstante von OpenSSL.Hinzugefügt in Version 3.2.
- ssl.OP_NO_SSLv2¶
Verhindert eine SSLv2-Verbindung. Diese Option ist nur in Verbindung mit
PROTOCOL_TLSanwendbar. Sie verhindert, dass die Peers SSLv2 als Protokollversion wählen.Hinzugefügt in Version 3.2.
Veraltet seit Version 3.6: SSLv2 ist veraltet
- ssl.OP_NO_SSLv3¶
Verhindert eine SSLv3-Verbindung. Diese Option ist nur in Verbindung mit
PROTOCOL_TLSanwendbar. Sie verhindert, dass die Peers SSLv3 als Protokollversion wählen.Hinzugefügt in Version 3.2.
Veraltet seit Version 3.6: SSLv3 ist veraltet
- ssl.OP_NO_TLSv1¶
Verhindert eine TLSv1-Verbindung. Diese Option ist nur in Verbindung mit
PROTOCOL_TLSanwendbar. Sie verhindert, dass die Peers TLSv1 als Protokollversion wählen.Hinzugefügt in Version 3.2.
Veraltet seit Version 3.7: Die Option ist seit OpenSSL 1.1.0 veraltet, verwenden Sie stattdessen die neuen
SSLContext.minimum_versionundSSLContext.maximum_version.
- ssl.OP_NO_TLSv1_1¶
Verhindert eine TLSv1.1-Verbindung. Diese Option ist nur in Verbindung mit
PROTOCOL_TLSanwendbar. Sie verhindert, dass die Peers TLSv1.1 als Protokollversion wählen. Verfügbar nur mit openssl Version 1.0.1+.Hinzugefügt in Version 3.4.
Veraltet seit Version 3.7: Die Option ist seit OpenSSL 1.1.0 veraltet.
- ssl.OP_NO_TLSv1_2¶
Verhindert eine TLSv1.2-Verbindung. Diese Option ist nur in Verbindung mit
PROTOCOL_TLSanwendbar. Sie verhindert, dass die Peers TLSv1.2 als Protokollversion wählen. Verfügbar nur mit openssl Version 1.0.1+.Hinzugefügt in Version 3.4.
Veraltet seit Version 3.7: Die Option ist seit OpenSSL 1.1.0 veraltet.
- ssl.OP_NO_TLSv1_3¶
Verhindert eine TLSv1.3-Verbindung. Diese Option ist nur in Verbindung mit
PROTOCOL_TLSanwendbar. Sie verhindert, dass die Peers TLSv1.3 als Protokollversion wählen. TLS 1.3 ist mit OpenSSL 1.1.1 oder neuer verfügbar. Wenn Python gegen eine ältere Version von OpenSSL kompiliert wurde, ist das Flag standardmäßig auf 0 gesetzt.Hinzugefügt in Version 3.6.3.
Veraltet seit Version 3.7: Die Option ist seit OpenSSL 1.1.0 veraltet. Sie wurde zu 2.7.15 und 3.6.3 zur Abwärtskompatibilität mit OpenSSL 1.0.2 hinzugefügt.
- ssl.OP_NO_RENEGOTIATION¶
Deaktiviert alle Neuverhandlungen in TLSv1.2 und früheren Versionen. Sendet keine HelloRequest-Nachrichten und ignoriert Neuverhandlungsanfragen über ClientHello.
Diese Option ist nur mit OpenSSL 1.1.0h und neuer verfügbar.
Hinzugefügt in Version 3.7.
- ssl.OP_CIPHER_SERVER_PREFERENCE¶
Verwendet die Cipher-Reihenfolge des Servers anstelle der des Clients. Diese Option hat keine Auswirkung auf Client-Sockets und SSLv2-Server-Sockets.
Hinzugefügt in Version 3.3.
- ssl.OP_SINGLE_DH_USE¶
Verhindert die Wiederverwendung desselben DH-Schlüssels für verschiedene SSL-Sitzungen. Dies verbessert die Forward Secrecy, erfordert jedoch mehr Rechenressourcen. Diese Option gilt nur für Server-Sockets.
Hinzugefügt in Version 3.3.
- ssl.OP_SINGLE_ECDH_USE¶
Verhindert die Wiederverwendung desselben ECDH-Schlüssels für verschiedene SSL-Sitzungen. Dies verbessert die Forward Secrecy, erfordert jedoch mehr Rechenressourcen. Diese Option gilt nur für Server-Sockets.
Hinzugefügt in Version 3.3.
- ssl.OP_ENABLE_MIDDLEBOX_COMPAT¶
Sendet Dummy Change Cipher Spec (CCS) Nachrichten im TLS 1.3 Handshake, damit eine TLS 1.3-Verbindung eher wie eine TLS 1.2-Verbindung aussieht.
Diese Option ist nur mit OpenSSL 1.1.1 und neuer verfügbar.
Hinzugefügt in Version 3.8.
- ssl.OP_NO_COMPRESSION¶
Deaktiviert die Kompression auf dem SSL-Kanal. Dies ist nützlich, wenn das Anwendungsprotokoll sein eigenes Komprimierungsschema unterstützt.
Hinzugefügt in Version 3.3.
- class ssl.Options¶
enum.IntFlagSammlung von OP_* Konstanten.
- ssl.OP_NO_TICKET¶
Verhindert, dass der Client eine Sitzungs-Ticket-Anfrage stellt.
Hinzugefügt in Version 3.6.
- ssl.OP_IGNORE_UNEXPECTED_EOF¶
Ignoriert unerwartete Beendigung von TLS-Verbindungen.
Diese Option ist nur mit OpenSSL 3.0.0 und neuer verfügbar.
Hinzugefügt in Version 3.10.
- ssl.OP_ENABLE_KTLS¶
Aktiviert die Verwendung von Kernel TLS. Um von der Funktion zu profitieren, muss OpenSSL mit Unterstützung dafür kompiliert worden sein und die ausgehandelten Cipher-Suiten und Erweiterungen müssen von ihm unterstützt werden (eine Liste der unterstützten kann je nach Plattform und Kernelversion variieren).
Beachten Sie, dass mit aktiviertem Kernel TLS einige kryptografische Operationen direkt vom Kernel und nicht über verfügbare OpenSSL-Provider ausgeführt werden. Dies kann unerwünscht sein, wenn die Anwendung beispielsweise alle kryptografischen Operationen vom FIPS-Provider ausführen lassen möchte.
Diese Option ist nur mit OpenSSL 3.0.0 und neuer verfügbar.
Hinzugefügt in Version 3.12.
- ssl.OP_LEGACY_SERVER_CONNECT¶
Erlaubt Legacy-unsichere Neuverhandlungen nur zwischen OpenSSL und ungepatchten Servern.
Hinzugefügt in Version 3.12.
- ssl.HAS_ALPN¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für die Application-Layer Protocol Negotiation TLS-Erweiterung gemäß RFC 7301 hat.
Hinzugefügt in Version 3.5.
- ssl.HAS_NEVER_CHECK_COMMON_NAME¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für die Nichtprüfung des Subject Common Name hat und
SSLContext.hostname_checks_common_nameschreibbar ist.Hinzugefügt in Version 3.7.
- ssl.HAS_ECDH¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für den Elliptic Curve-basierten Diffie-Hellman Schlüsselaustausch hat. Dies sollte wahr sein, es sei denn, die Funktion wurde vom Distributor explizit deaktiviert.
Hinzugefügt in Version 3.3.
- ssl.HAS_SNI¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für die Server Name Indication Erweiterung hat (wie in RFC 6066 definiert).
Hinzugefügt in Version 3.2.
- ssl.HAS_NPN¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für Next Protocol Negotiation hat, wie in der Application Layer Protocol Negotiation beschrieben. Wenn wahr, können Sie die Methode
SSLContext.set_npn_protocols()verwenden, um zu werben, welche Protokolle Sie unterstützen möchten.Hinzugefügt in Version 3.3.
- ssl.HAS_SSLv2¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für das SSL 2.0-Protokoll hat.
Hinzugefügt in Version 3.7.
- ssl.HAS_SSLv3¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für das SSL 3.0-Protokoll hat.
Hinzugefügt in Version 3.7.
- ssl.HAS_TLSv1¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für das TLS 1.0-Protokoll hat.
Hinzugefügt in Version 3.7.
- ssl.HAS_TLSv1_1¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für das TLS 1.1-Protokoll hat.
Hinzugefügt in Version 3.7.
- ssl.HAS_TLSv1_2¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für das TLS 1.2-Protokoll hat.
Hinzugefügt in Version 3.7.
- ssl.HAS_TLSv1_3¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für das TLS 1.3-Protokoll hat.
Hinzugefügt in Version 3.7.
- ssl.HAS_PSK¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für TLS-PSK hat.
Hinzugefügt in Version 3.13.
- ssl.HAS_PHA¶
Ob die OpenSSL-Bibliothek integrierte Unterstützung für TLS-PHA hat.
Hinzugefügt in Version 3.14.
- ssl.CHANNEL_BINDING_TYPES¶
Liste der unterstützten TLS-Kanalbindungsarten. Zeichenketten in dieser Liste können als Argumente für
SSLSocket.get_channel_binding()verwendet werden.Hinzugefügt in Version 3.3.
- ssl.OPENSSL_VERSION¶
Der Versionsstring der von dem Interpreter geladenen OpenSSL-Bibliothek
>>> ssl.OPENSSL_VERSION 'OpenSSL 1.0.2k 26 Jan 2017'
Hinzugefügt in Version 3.2.
- ssl.OPENSSL_VERSION_INFO¶
Ein Tupel aus fünf ganzen Zahlen, das Versionsinformationen über die OpenSSL-Bibliothek darstellt
>>> ssl.OPENSSL_VERSION_INFO (1, 0, 2, 11, 15)
Hinzugefügt in Version 3.2.
- ssl.OPENSSL_VERSION_NUMBER¶
Die rohe Versionsnummer der OpenSSL-Bibliothek als einzelne ganze Zahl
>>> ssl.OPENSSL_VERSION_NUMBER 268443839 >>> hex(ssl.OPENSSL_VERSION_NUMBER) '0x100020bf'
Hinzugefügt in Version 3.2.
- ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE¶
- ssl.ALERT_DESCRIPTION_INTERNAL_ERROR¶
- ALERT_DESCRIPTION_*
Alarmbeschreibungen aus RFC 5246 und anderen. Die IANA TLS Alert Registry enthält diese Liste und Verweise auf die RFCs, in denen ihre Bedeutung definiert ist.
Wird als Rückgabewert der Callback-Funktion in
SSLContext.set_servername_callback()verwendet.Hinzugefügt in Version 3.4.
- class ssl.AlertDescription¶
enum.IntEnumSammlung von ALERT_DESCRIPTION_* Konstanten.Hinzugefügt in Version 3.6.
- Purpose.SERVER_AUTH¶
Option für
create_default_context()undSSLContext.load_default_certs(). Dieser Wert zeigt an, dass der Kontext zur Authentifizierung von Webservern verwendet werden kann (daher wird er zum Erstellen von Client-seitigen Sockets verwendet).Hinzugefügt in Version 3.4.
- Purpose.CLIENT_AUTH¶
Option für
create_default_context()undSSLContext.load_default_certs(). Dieser Wert zeigt an, dass der Kontext zur Authentifizierung von Web-Clients verwendet werden kann (daher wird er zum Erstellen von Server-seitigen Sockets verwendet).Hinzugefügt in Version 3.4.
- class ssl.SSLErrorNumber¶
enum.IntEnumSammlung von SSL_ERROR_* Konstanten.Hinzugefügt in Version 3.6.
- class ssl.TLSVersion¶
enum.IntEnumSammlung von SSL- und TLS-Versionen fürSSLContext.maximum_versionundSSLContext.minimum_version.Hinzugefügt in Version 3.7.
- TLSVersion.MINIMUM_SUPPORTED¶
- TLSVersion.MAXIMUM_SUPPORTED¶
Die mindestens bzw. maximal unterstützte SSL- oder TLS-Version. Dies sind magische Konstanten. Ihre Werte spiegeln nicht die niedrigsten und höchsten verfügbaren TLS/SSL-Versionen wider.
- TLSVersion.SSLv3¶
- TLSVersion.TLSv1¶
- TLSVersion.TLSv1_1¶
- TLSVersion.TLSv1_2¶
- TLSVersion.TLSv1_3¶
SSL 3.0 bis TLS 1.3.
Veraltet seit Version 3.10: Alle
TLSVersionMitglieder mit Ausnahme vonTLSVersion.TLSv1_2undTLSVersion.TLSv1_3sind veraltet.
SSL Sockets¶
- class ssl.SSLSocket(socket.socket)¶
SSL-Sockets bieten die folgenden Methoden von Socket Objects
recv(),recv_into()(aber die Übergabe eines Nicht-Null-flags-Arguments ist nicht erlaubt)sendfile()(aberos.sendfilewird nur für Plain-Text-Sockets verwendet, andernfalls wirdsend()verwendet)
Da jedoch das SSL- (und TLS-)Protokoll sein eigenes Framing über TCP hat, kann die SSL-Socket-Abstraktion in gewisser Hinsicht von der Spezifikation normaler, OS-Level-Sockets abweichen. Siehe insbesondere die Hinweise zu nicht-blockierenden Sockets.
Instanzen von
SSLSocketmüssen mit der MethodeSSLContext.wrap_socket()erstellt werden.Geändert in Version 3.5: Die Methode
sendfile()wurde hinzugefügt.Geändert in Version 3.5:
shutdown()setzt das Socket-Timeout nicht jedes Mal zurück, wenn Bytes empfangen oder gesendet werden. Das Socket-Timeout ist nun die maximale Gesamtdauer des Shutdowns.Veraltet seit Version 3.6: Es ist veraltet, eine
SSLSocket-Instanz direkt zu erstellen. Verwenden SieSSLContext.wrap_socket(), um einen Socket zu wrappen.Geändert in Version 3.7:
SSLSocket-Instanzen müssen mitwrap_socket()erstellt werden. In früheren Versionen war es möglich, Instanzen direkt zu erstellen. Dies wurde nie dokumentiert oder offiziell unterstützt.Geändert in Version 3.10: Python verwendet nun intern
SSL_read_exundSSL_write_ex. Die Funktionen unterstützen das Lesen und Schreiben von Daten größer als 2 GB. Das Schreiben von Null-Länge-Daten führt nicht mehr zu einem Protokollverletzungsfehler.
SSL-Sockets haben auch die folgenden zusätzlichen Methoden und Attribute
- SSLSocket.read(len=1024, buffer=None)¶
Liest bis zu len Bytes aus dem SSL-Socket und gibt das Ergebnis als
bytes-Instanz zurück. Wenn buffer angegeben ist, wird stattdessen in den Puffer gelesen, und die Anzahl der gelesenen Bytes wird zurückgegeben.Löst
SSLWantReadErroroderSSLWantWriteErroraus, wenn der Socket nicht-blockierend ist und das Lesen blockieren würde.Da jederzeit eine Neuverhandlung möglich ist, kann ein Aufruf von
read()auch Schreibvorgänge auslösen.Geändert in Version 3.5: Das Socket-Timeout wird nicht mehr jedes Mal zurückgesetzt, wenn Bytes empfangen oder gesendet werden. Das Socket-Timeout ist nun die maximale Gesamtdauer zum Lesen von bis zu len Bytes.
Veraltet seit Version 3.6: Verwenden Sie
recv()anstelle vonread().
- SSLSocket.write(data)¶
Schreibt data in den SSL-Socket und gibt die Anzahl der geschriebenen Bytes zurück. Das data-Argument muss ein Objekt sein, das die Buffer-Schnittstelle unterstützt.
Löst
SSLWantReadErroroderSSLWantWriteErroraus, wenn der Socket nicht-blockierend ist und das Schreiben blockieren würde.Da jederzeit eine Neuverhandlung möglich ist, kann ein Aufruf von
write()auch Lesevorgänge auslösen.Geändert in Version 3.5: Das Socket-Timeout wird nicht mehr jedes Mal zurückgesetzt, wenn Bytes empfangen oder gesendet werden. Das Socket-Timeout ist nun die maximale Gesamtdauer zum Schreiben von data.
Veraltet seit Version 3.6: Verwenden Sie
send()anstelle vonwrite().
Hinweis
Die Methoden read() und write() sind die Low-Level-Methoden, die unverschlüsselte Anwendungsdaten lesen und schreiben und diese zu verschlüsselten Daten auf Draht-Ebene entschlüsseln/verschlüsseln. Diese Methoden erfordern eine aktive SSL-Verbindung, d.h. der Handshake wurde abgeschlossen und SSLSocket.unwrap() wurde nicht aufgerufen.
Normalerweise sollten Sie stattdessen die Socket-API-Methoden wie recv() und send() verwenden.
- SSLSocket.do_handshake(block=False)¶
Führt den SSL-Setup-Handshake durch.
Wenn block true ist und das durch
gettimeout()erhaltene Timeout Null ist, wird der Socket im blockierenden Modus gesetzt, bis der Handshake durchgeführt ist.Geändert in Version 3.4: Die Handshake-Methode führt auch
match_hostname()aus, wenn das Attributcheck_hostnamedescontextdes Sockets true ist.Geändert in Version 3.5: Das Socket-Timeout wird nicht mehr jedes Mal zurückgesetzt, wenn Bytes empfangen oder gesendet werden. Das Socket-Timeout ist nun die maximale Gesamtdauer des Handshakes.
Geändert in Version 3.7: Hostname oder IP-Adresse werden während des Handshakes von OpenSSL abgeglichen. Die Funktion
match_hostname()wird nicht mehr verwendet. Wenn OpenSSL einen Hostnamen oder eine IP-Adresse ablehnt, wird der Handshake frühzeitig abgebrochen und eine TLS-Alert-Nachricht an den Peer gesendet.
- SSLSocket.getpeercert(binary_form=False)¶
Wenn kein Zertifikat für den Peer am anderen Ende der Verbindung vorhanden ist, wird
Nonezurückgegeben. Wenn der SSL-Handshake noch nicht erfolgt ist, wirdValueErrorausgelöst.Wenn der Parameter
binary_formaufFalsegesetzt ist und ein Zertifikat vom Peer empfangen wurde, gibt diese Methode einedict-Instanz zurück. Wenn das Zertifikat nicht validiert wurde, ist das Dictionary leer. Wenn das Zertifikat validiert wurde, gibt es ein Dictionary mit mehreren Schlüsseln zurück, daruntersubject(der Principal, für den das Zertifikat ausgestellt wurde) undissuer(der Principal, der das Zertifikat ausgestellt hat). Wenn ein Zertifikat eine Instanz der Erweiterung *Subject Alternative Name* enthält (siehe RFC 3280), gibt es auch einen SchlüsselsubjectAltNameim Dictionary.Die Felder
subjectundissuersind Tupel, die die Sequenz von relativen Distinguished Names (RDNs) enthalten, die in der Datenstruktur des Zertifikats für die jeweiligen Felder angegeben sind, und jeder RDN ist eine Sequenz von Namens-Wert-Paaren. Hier ist ein reales Beispiel{'issuer': ((('countryName', 'IL'),), (('organizationName', 'StartCom Ltd.'),), (('organizationalUnitName', 'Secure Digital Certificate Signing'),), (('commonName', 'StartCom Class 2 Primary Intermediate Server CA'),)), 'notAfter': 'Nov 22 08:15:19 2013 GMT', 'notBefore': 'Nov 21 03:09:52 2011 GMT', 'serialNumber': '95F0', 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),), (('countryName', 'US'),), (('stateOrProvinceName', 'California'),), (('localityName', 'San Francisco'),), (('organizationName', 'Electronic Frontier Foundation, Inc.'),), (('commonName', '*.eff.org'),), (('emailAddress', 'hostmaster@eff.org'),)), 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')), 'version': 3}
Wenn der Parameter
binary_formaufTruegesetzt ist und ein Zertifikat bereitgestellt wurde, gibt diese Methode die DER-kodierte Form des gesamten Zertifikats als Bytesequenz zurück oderNone, wenn der Peer kein Zertifikat bereitgestellt hat. Ob der Peer ein Zertifikat bereitstellt, hängt von der Rolle des SSL-Sockets abfür einen Client-SSL-Socket stellt der Server immer ein Zertifikat bereit, unabhängig davon, ob eine Validierung erforderlich war;
für einen Server-SSL-Socket stellt der Client nur dann ein Zertifikat bereit, wenn er vom Server dazu aufgefordert wird; daher gibt
getpeercert()Nonezurück, wenn SieCERT_NONE(anstelle vonCERT_OPTIONALoderCERT_REQUIRED) verwendet haben.
Siehe auch
SSLContext.check_hostname.Geändert in Version 3.2: Das zurückgegebene Dictionary enthält zusätzliche Elemente wie
issuerundnotBefore.Geändert in Version 3.4:
ValueErrorwird ausgelöst, wenn der Handshake noch nicht erfolgt ist. Das zurückgegebene Dictionary enthält zusätzliche X509v3-Erweiterungselemente wiecrlDistributionPoints,caIssuersundOCSPURIs.Geändert in Version 3.9: IPv6-Adressstrings haben kein nachgestelltes Zeilenumbruchszeichen mehr.
- SSLSocket.get_verified_chain()¶
Gibt die verifizierte Zertifikatkette des anderen Endes des SSL-Kanals als Liste von DER-kodierten Bytes zurück. Wenn die Zertifikatsprüfung deaktiviert war, verhält sich die Methode gleich wie
get_unverified_chain().Hinzugefügt in Version 3.13.
- SSLSocket.get_unverified_chain()¶
Gibt die rohe Zertifikatkette des anderen Endes des SSL-Kanals als Liste von DER-kodierten Bytes zurück.
Hinzugefügt in Version 3.13.
- SSLSocket.cipher()¶
Gibt ein dreiwertiges Tupel zurück, das den Namen der verwendeten Chiffre, die Version des SSL-Protokolls, das deren Verwendung definiert, und die Anzahl der verwendeten geheimen Bits enthält. Wenn keine Verbindung hergestellt wurde, wird
Nonezurückgegeben.
Gibt die Liste der Chiffren zurück, die sowohl auf Client- als auch auf Serverseite verfügbar sind. Jeder Eintrag der zurückgegebenen Liste ist ein dreiwertiges Tupel, das den Namen der Chiffre, die Version des SSL-Protokolls, das deren Verwendung definiert, und die Anzahl der geheimen Bits enthält, die die Chiffre verwendet.
shared_ciphers()gibtNonezurück, wenn keine Verbindung hergestellt wurde oder der Socket ein Client-Socket ist.Hinzugefügt in Version 3.5.
- SSLSocket.compression()¶
Gibt den verwendeten Kompressionsalgorithmus als Zeichenkette zurück oder
None, wenn die Verbindung nicht komprimiert ist.Wenn das übergeordnete Protokoll einen eigenen Kompressionsmechanismus unterstützt, können Sie
OP_NO_COMPRESSIONverwenden, um die SSL-Komprimierung zu deaktivieren.Hinzugefügt in Version 3.3.
- SSLSocket.get_channel_binding(cb_type='tls-unique')¶
Ruft Channel-Binding-Daten für die aktuelle Verbindung als Bytes-Objekt ab. Gibt
Nonezurück, wenn keine Verbindung besteht oder der Handshake noch nicht abgeschlossen wurde.Der Parameter cb_type ermöglicht die Auswahl des gewünschten Channel-Binding-Typs. Gültige Channel-Binding-Typen sind in der Liste
CHANNEL_BINDING_TYPESaufgeführt. Derzeit wird nur das 'tls-unique'-Channel-Binding, definiert in RFC 5929, unterstützt.ValueErrorwird ausgelöst, wenn ein nicht unterstützter Channel-Binding-Typ angefordert wird.Hinzugefügt in Version 3.3.
- SSLSocket.selected_alpn_protocol()¶
Gibt das Protokoll zurück, das während des TLS-Handshakes ausgewählt wurde. Wenn
SSLContext.set_alpn_protocols()nicht aufgerufen wurde, die andere Partei ALPN nicht unterstützt, dieser Socket keine der vorgeschlagenen Protokolle des Clients unterstützt oder der Handshake noch nicht stattgefunden hat, wirdNonezurückgegeben.Hinzugefügt in Version 3.5.
- SSLSocket.selected_npn_protocol()¶
Gibt das übergeordnete Protokoll zurück, das während des TLS/SSL-Handshakes ausgewählt wurde. Wenn
SSLContext.set_npn_protocols()nicht aufgerufen wurde, die andere Partei NPN nicht unterstützt oder der Handshake noch nicht stattgefunden hat, wird diesNonezurückgeben.Hinzugefügt in Version 3.3.
Veraltet seit Version 3.10: NPN wurde durch ALPN abgelöst
- SSLSocket.unwrap()¶
Führt den SSL-Shutdown-Handshake durch, der die TLS-Schicht vom zugrunde liegenden Socket entfernt, und gibt das zugrunde liegende Socket-Objekt zurück. Dies kann verwendet werden, um von verschlüsseltem Betrieb über eine Verbindung zu unverschlüsseltem Betrieb zu wechseln. Der zurückgegebene Socket sollte für weitere Kommunikation mit der anderen Seite der Verbindung verwendet werden, anstatt des ursprünglichen Sockets.
- SSLSocket.verify_client_post_handshake()¶
Fordert von einem TLS 1.3-Client eine Post-Handshake-Authentifizierung (PHA) an. PHA kann nur für eine TLS 1.3-Verbindung von einem serverseitigen Socket initiiert werden, nach dem initialen TLS-Handshake und wenn PHA auf beiden Seiten aktiviert ist, siehe
SSLContext.post_handshake_auth.Die Methode führt nicht sofort einen Zertifikataustausch durch. Die Serverseite sendet eine CertificateRequest während des nächsten Schreibereignisses und erwartet, dass der Client auf das nächste Leseereignis mit einem Zertifikat antwortet.
Wenn eine Vorbedingung nicht erfüllt ist (z.B. kein TLS 1.3, PHA nicht aktiviert), wird eine
SSLErrorausgelöst.Hinweis
Nur verfügbar mit OpenSSL 1.1.1 und TLS 1.3 aktiviert. Ohne TLS 1.3-Unterstützung löst die Methode
NotImplementedErroraus.Hinzugefügt in Version 3.8.
- SSLSocket.version()¶
Gibt die tatsächliche SSL-Protokollversion, die von der Verbindung ausgehandelt wurde, als Zeichenkette zurück, oder
None, wenn keine sichere Verbindung hergestellt wurde. Derzeit mögliche Rückgabewerte sind"SSLv2","SSLv3","TLSv1","TLSv1.1"und"TLSv1.2". Neuere OpenSSL-Versionen können weitere Rückgabewerte definieren.Hinzugefügt in Version 3.5.
- SSLSocket.pending()¶
Gibt die Anzahl der bereits entschlüsselten Bytes zurück, die zum Lesen verfügbar sind und auf der Verbindung ausstehen.
- SSLSocket.context¶
Das
SSLContext-Objekt, an das dieser SSL-Socket gebunden ist.Hinzugefügt in Version 3.2.
- SSLSocket.server_side¶
Ein boolescher Wert, der für serverseitige Sockets
Trueund für clientseitige SocketsFalseist.Hinzugefügt in Version 3.2.
- SSLSocket.server_hostname¶
Hostname des Servers:
str-Typ oderNonefür serverseitige Sockets oder wenn der Hostname nicht im Konstruktor angegeben wurde.Hinzugefügt in Version 3.2.
Geändert in Version 3.7: Das Attribut ist jetzt immer ASCII-Text. Wenn
server_hostnameein internationalisierter Domain-Name (IDN) ist, speichert dieses Attribut nun die A-Label-Form ("xn--pythn-mua.org") anstelle der U-Label-Form ("pythön.org").
- SSLSocket.session¶
Die
SSLSessionfür diese SSL-Verbindung. Die Sitzung ist für Client- und Serversockets verfügbar, nachdem der TLS-Handshake durchgeführt wurde. Für Client-Sockets kann die Sitzung vor dem Aufruf vondo_handshake()gesetzt werden, um eine Sitzung wiederzuverwenden.Hinzugefügt in Version 3.6.
- SSLSocket.session_reused¶
Hinzugefügt in Version 3.6.
SSL-Kontexte¶
Hinzugefügt in Version 3.2.
Ein SSL-Kontext speichert verschiedene Daten, die länger als einzelne SSL-Verbindungen bestehen, wie z.B. SSL-Konfigurationsoptionen, Zertifikate und private Schlüssel. Er verwaltet auch einen Cache von SSL-Sitzungen für serverseitige Sockets, um wiederholte Verbindungen von denselben Clients zu beschleunigen.
- class ssl.SSLContext(protocol=None)¶
Erzeugt einen neuen SSL-Kontext. Sie können protocol übergeben, das eine der Konstanten
PROTOCOL_*sein muss, die in diesem Modul definiert sind. Der Parameter gibt an, welche Version des SSL-Protokolls verwendet werden soll. Typischerweise wählt der Server eine bestimmte Protokollversion aus, und der Client muss sich an die Wahl des Servers anpassen. Die meisten Versionen sind nicht mit anderen Versionen interoperabel. Wenn nicht angegeben, ist der StandardPROTOCOL_TLS; dies bietet die höchste Kompatibilität mit anderen Versionen.Hier ist eine Tabelle, die zeigt, welche Versionen eines Clients (an der Seite) mit welchen Versionen eines Servers (oben) verbunden werden können
Client / Server
SSLv2
SSLv3
TLS [3]
TLSv1
TLSv1.1
TLSv1.2
SSLv2
ja
nein
nein [1]
nein
nein
nein
SSLv3
nein
ja
nein [2]
nein
nein
nein
TLS (SSLv23) [3]
nein [1]
nein [2]
ja
ja
ja
ja
TLSv1
nein
nein
ja
ja
nein
nein
TLSv1.1
nein
nein
ja
nein
ja
nein
TLSv1.2
nein
nein
ja
nein
nein
ja
Fußnoten
Siehe auch
create_default_context()lässt das ModulsslSicherheitseinstellungen für einen bestimmten Zweck auswählen.Geändert in Version 3.6: Der Kontext wird mit sicheren Standardwerten erstellt. Die Optionen
OP_NO_COMPRESSION,OP_CIPHER_SERVER_PREFERENCE,OP_SINGLE_DH_USE,OP_SINGLE_ECDH_USE,OP_NO_SSLv2undOP_NO_SSLv3(außer fürPROTOCOL_SSLv3) werden standardmäßig gesetzt. Die anfängliche Chiffrensuite-Liste enthält nurHIGH-Chiffren, keineNULL-Chiffren und keineMD5-Chiffren.Veraltet seit Version 3.10:
SSLContextohne Protokollargument ist veraltet. Die Kontextklasse wird in Zukunft entwederPROTOCOL_TLS_CLIENToderPROTOCOL_TLS_SERVERerfordern.Geändert in Version 3.10: Die Standard-Chiffrensuiten enthalten nun nur sichere AES- und ChaCha20-Chiffren mit Forward Secrecy und Sicherheitsstufe 2. RSA- und DH-Schlüssel mit weniger als 2048 Bits und ECC-Schlüssel mit weniger als 224 Bits sind verboten.
PROTOCOL_TLS,PROTOCOL_TLS_CLIENTundPROTOCOL_TLS_SERVERverwenden TLS 1.2 als minimale TLS-Version.Hinweis
SSLContextunterstützt nur begrenzte Mutationen, sobald er von einer Verbindung verwendet wurde. Das Hinzufügen neuer Zertifikate zum internen Vertrauensspeicher ist erlaubt, aber das Ändern von Chiffren, Veriesiąinstellungen oder mTLS-Zertifikaten kann zu überraschendem Verhalten führen.Hinweis
SSLContextist dafür konzipiert, geteilt und von mehreren Verbindungen verwendet zu werden. Daher ist er threadsicher, solange er nicht neu konfiguriert wird, nachdem er von einer Verbindung verwendet wurde.
SSLContext-Objekte haben die folgenden Methoden und Attribute
- SSLContext.cert_store_stats()¶
Gibt Statistiken über die Mengen der geladenen X.509-Zertifikate, die Anzahl der als CA-Zertifikate gekennzeichneten X.509-Zertifikate und Zertifikatssperrlisten als Dictionary zurück.
Beispiel für einen Kontext mit einem CA-Zertifikat und einem weiteren Zertifikat
>>> context.cert_store_stats() {'crl': 0, 'x509_ca': 1, 'x509': 2}
Hinzugefügt in Version 3.4.
- SSLContext.load_cert_chain(certfile, keyfile=None, password=None)¶
Laden Sie einen privaten Schlüssel und das zugehörige Zertifikat. Die Zeichenkette certfile muss der Pfad zu einer einzelnen Datei im PEM-Format sein, die das Zertifikat sowie eine beliebige Anzahl von CA-Zertifikaten enthält, die zur Feststellung der Echtheit des Zertifikats erforderlich sind. Die Zeichenkette keyfile muss, falls vorhanden, auf eine Datei mit dem privaten Schlüssel verweisen. Andernfalls wird der private Schlüssel ebenfalls aus certfile entnommen. Weitere Informationen darüber, wie das Zertifikat in der Datei certfile gespeichert ist, finden Sie in der Diskussion unter Zertifikate.
Das Argument password kann eine Funktion sein, die aufgerufen wird, um das Passwort zum Entschlüsseln des privaten Schlüssels zu erhalten. Sie wird nur aufgerufen, wenn der private Schlüssel verschlüsselt ist und ein Passwort benötigt wird. Sie wird ohne Argumente aufgerufen und sollte eine Zeichenkette, Bytes oder ein Bytearray zurückgeben. Wenn der Rückgabewert eine Zeichenkette ist, wird sie vor der Verwendung zur Entschlüsselung des Schlüssels als UTF-8 kodiert. Alternativ kann ein Zeichenketten-, Byte- oder Bytearraywert direkt als Argument password übergeben werden. Er wird ignoriert, wenn der private Schlüssel nicht verschlüsselt ist und kein Passwort benötigt wird.
Wenn das Argument password nicht angegeben ist und ein Passwort erforderlich ist, wird der integrierte Passwortabrufmechanismus von OpenSSL verwendet, um den Benutzer interaktiv nach einem Passwort zu fragen.
Wenn der private Schlüssel nicht mit dem Zertifikat übereinstimmt, wird ein
SSLErrorausgelöst.Geändert in Version 3.3: Neues optionales Argument password.
- SSLContext.load_default_certs(purpose=Purpose.SERVER_AUTH)¶
Laden Sie einen Satz von Standard-"Zertifizierungsstellen" (CA)-Zertifikaten aus Standard-Speicherorten. Unter Windows werden CA-Zertifikate aus den System-Stores
CAundROOTgeladen. Auf allen Systemen wirdSSLContext.set_default_verify_paths()aufgerufen. Zukünftig kann die Methode auch CA-Zertifikate aus anderen Speicherorten laden.Das Flag purpose gibt an, welche Art von CA-Zertifikaten geladen werden. Die Standardeinstellung
Purpose.SERVER_AUTHlädt Zertifikate, die für die TLS-Webserver-Authentifizierung (Client-seitige Sockets) gekennzeichnet und vertrauenswürdig sind.Purpose.CLIENT_AUTHlädt CA-Zertifikate für die Überprüfung von Client-Zertifikaten auf der Serverseite.Hinzugefügt in Version 3.4.
- SSLContext.load_verify_locations(cafile=None, capath=None, cadata=None)¶
Laden Sie einen Satz von "Zertifizierungsstellen" (CA)-Zertifikaten, die zur Validierung der Zertifikate anderer Peers verwendet werden, wenn
verify_modeanders alsCERT_NONEist. Mindestens einer der Parameter cafile oder capath muss angegeben werden.Diese Methode kann auch Zertifikatssperrlisten (CRLs) im PEM- oder DER-Format laden. Um CRLs nutzen zu können, muss
SSLContext.verify_flagsordnungsgemäß konfiguriert sein.Die Zeichenkette cafile ist, falls vorhanden, der Pfad zu einer Datei mit verketteten CA-Zertifikaten im PEM-Format. Wie die Zertifikate in dieser Datei angeordnet werden sollen, erfahren Sie in der Diskussion unter Zertifikate.
Die Zeichenkette capath ist, falls vorhanden, der Pfad zu einem Verzeichnis, das mehrere CA-Zertifikate im PEM-Format enthält und einem OpenSSL-spezifischen Layout folgt.
Das Objekt cadata ist, falls vorhanden, entweder eine ASCII-Zeichenkette mit einem oder mehreren PEM-kodierten Zertifikaten oder ein byteähnliches Objekt mit DER-kodierten Zertifikaten. Ähnlich wie bei capath werden zusätzliche Zeilen um PEM-kodierte Zertifikate herum ignoriert, aber mindestens ein Zertifikat muss vorhanden sein.
Geändert in Version 3.4: Neues optionales Argument cadata
- SSLContext.get_ca_certs(binary_form=False)¶
Rufen Sie eine Liste der geladenen CA-Zertifikate ab. Wenn der Parameter
binary_formFalseist, ist jeder Listeneintrag ein Dictionary wie die Ausgabe vonSSLSocket.getpeercert(). Andernfalls gibt die Methode eine Liste DER-kodierter Zertifikate zurück. Die zurückgegebene Liste enthält keine Zertifikate aus capath, es sei denn, ein Zertifikat wurde durch eine SSL-Verbindung angefordert und geladen.Hinweis
Zertifikate in einem capath-Verzeichnis werden nicht geladen, es sei denn, sie wurden mindestens einmal verwendet.
Hinzugefügt in Version 3.4.
- SSLContext.get_ciphers()¶
Rufen Sie eine Liste der aktivierten Cipher ab. Die Liste ist in der Reihenfolge der Cipher-Priorität angeordnet. Siehe
SSLContext.set_ciphers().Beispiel
>>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) >>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA') >>> ctx.get_ciphers() [{'aead': True, 'alg_bits': 256, 'auth': 'auth-rsa', 'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA ' 'Enc=AESGCM(256) Mac=AEAD', 'digest': None, 'id': 50380848, 'kea': 'kx-ecdhe', 'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'protocol': 'TLSv1.2', 'strength_bits': 256, 'symmetric': 'aes-256-gcm'}, {'aead': True, 'alg_bits': 128, 'auth': 'auth-rsa', 'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA ' 'Enc=AESGCM(128) Mac=AEAD', 'digest': None, 'id': 50380847, 'kea': 'kx-ecdhe', 'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'protocol': 'TLSv1.2', 'strength_bits': 128, 'symmetric': 'aes-128-gcm'}]
Hinzugefügt in Version 3.6.
- SSLContext.set_default_verify_paths()¶
Laden Sie einen Satz von Standard-"Zertifizierungsstellen" (CA)-Zertifikaten aus einem Dateisystempfad, der beim Erstellen der OpenSSL-Bibliothek definiert wurde. Leider gibt es keine einfache Möglichkeit festzustellen, ob diese Methode erfolgreich ist: Es wird kein Fehler zurückgegeben, wenn keine Zertifikate gefunden werden. Wenn die OpenSSL-Bibliothek als Teil des Betriebssystems bereitgestellt wird, ist sie jedoch wahrscheinlich richtig konfiguriert.
- SSLContext.set_ciphers(ciphers, /)¶
Legen Sie die verfügbaren Cipher für Sockets fest, die mit diesem Kontext erstellt wurden. Dies sollte eine Zeichenkette im OpenSSL-Cipher-Listenformat sein. Wenn kein Cipher ausgewählt werden kann (weil Compile-Zeit-Optionen oder andere Konfigurationen die Verwendung aller angegebenen Cipher verbieten), wird ein
SSLErrorausgelöst.Hinweis
Nach der Verbindung gibt die Methode
SSLSocket.cipher()von SSL-Sockets den aktuell ausgewählten Cipher an.TLS 1.3 Cipher Suites können nicht mit
set_ciphers()deaktiviert werden.
- SSLContext.set_alpn_protocols(alpn_protocols)¶
Geben Sie an, welche Protokolle der Socket während des SSL/TLS-Handshakes aushandeln soll. Dies sollte eine Liste von ASCII-Zeichenketten sein, z. B.
['http/1.1', 'spdy/2'], geordnet nach Präferenz. Die Auswahl eines Protokolls erfolgt während des Handshakes und wird gemäß RFC 7301 ausgeführt. Nach einem erfolgreichen Handshake gibt die MethodeSSLSocket.selected_alpn_protocol()das vereinbarte Protokoll zurück.Diese Methode löst
NotImplementedErroraus, wennHAS_ALPNFalseist.Hinzugefügt in Version 3.5.
- SSLContext.set_npn_protocols(npn_protocols)¶
Geben Sie an, welche Protokolle der Socket während des SSL/TLS-Handshakes aushandeln soll. Dies sollte eine Liste von Zeichenketten sein, z. B.
['http/1.1', 'spdy/2'], geordnet nach Präferenz. Die Auswahl eines Protokolls erfolgt während des Handshakes und wird gemäß der Application Layer Protocol Negotiation ausgeführt. Nach einem erfolgreichen Handshake gibt die MethodeSSLSocket.selected_npn_protocol()das vereinbarte Protokoll zurück.Diese Methode löst
NotImplementedErroraus, wennHAS_NPNFalseist.Hinzugefügt in Version 3.3.
Veraltet seit Version 3.10: NPN wurde durch ALPN abgelöst
- SSLContext.sni_callback¶
Registrieren Sie eine Callback-Funktion, die aufgerufen wird, nachdem die TLS Client Hello-Handshake-Nachricht vom SSL/TLS-Server empfangen wurde, wenn der TLS-Client eine Server Name Indication angibt. Der Mechanismus der Server Name Indication ist in RFC 6066 Abschnitt 3 - Server Name Indication beschrieben.
Pro
SSLContextkann nur ein Callback gesetzt werden. Wenn sni_callback aufNonegesetzt wird, ist der Callback deaktiviert. Wenn diese Funktion ein zweites Mal aufgerufen wird, wird der zuvor registrierte Callback deaktiviert.Die Callback-Funktion wird mit drei Argumenten aufgerufen; das erste ist der
ssl.SSLSocket, das zweite ist eine Zeichenkette, die den Servernamen repräsentiert, mit dem der Client kommunizieren möchte (oderNone, wenn das TLS Client Hello keinen Servernamen enthält), und das dritte Argument ist der ursprünglicheSSLContext. Das Argument Servername ist Text. Für internationalisierte Domainnamen ist der Servername ein IDN A-Label ("xn--pythn-mua.org").Ein typischer Anwendungsfall für diesen Callback ist die Änderung des Attributs
SSLSocket.contextdesssl.SSLSocketin ein neues Objekt vom TypSSLContext, das eine Zertifikatkette repräsentiert, die mit dem Servernamen übereinstimmt.Aufgrund der frühen Verhandlungsphase der TLS-Verbindung sind nur begrenzte Methoden und Attribute nutzbar, wie z. B.
SSLSocket.selected_alpn_protocol()undSSLSocket.context. Die MethodenSSLSocket.getpeercert(),SSLSocket.get_verified_chain(),SSLSocket.get_unverified_chain()SSLSocket.cipher()undSSLSocket.compression()erfordern, dass die TLS-Verbindung über das TLS Client Hello hinaus fortgeschritten ist und geben daher keine aussagekräftigen Werte zurück, noch können sie sicher aufgerufen werden.Die Funktion sni_callback muss
Nonezurückgeben, um die TLS-Aushandlung fortzusetzen. Wenn ein TLS-Fehler erforderlich ist, kann eine KonstanteALERT_DESCRIPTION_INTERNAL_ERRORzurückgegeben werden. Andere Rückgabewerte führen zu einem fatalen TLS-Fehler mitALERT_DESCRIPTION_INTERNAL_ERROR.Wenn in der Funktion sni_callback eine Ausnahme ausgelöst wird, wird die TLS-Verbindung mit einer fatalen TLS-Alert-Nachricht
ALERT_DESCRIPTION_HANDSHAKE_FAILUREbeendet.Diese Methode löst
NotImplementedErroraus, wenn die OpenSSL-Bibliothek bei der Erstellung OPENSSL_NO_TLSEXT definiert hatte.Hinzugefügt in Version 3.7.
- SSLContext.set_servername_callback(server_name_callback)¶
Dies ist eine Legacy-API, die aus Kompatibilitätsgründen beibehalten wird. Wenn möglich, sollten Sie stattdessen
sni_callbackverwenden. Der angegebene server_name_callback ähnelt sni_callback, mit dem Unterschied, dass der server_name_callback ein dekodiertes U-Label ("pythön.org") erhält, wenn der Server-Hostname ein IDN-kodierter internationalisierter Domainname ist.Wenn ein Dekodierungsfehler beim Servernamen auftritt, wird die TLS-Verbindung mit einer fatalen TLS-Alert-Nachricht
ALERT_DESCRIPTION_INTERNAL_ERRORan den Client beendet.Hinzugefügt in Version 3.4.
- SSLContext.load_dh_params(dhfile, /)¶
Laden Sie die Parameter zur Schlüsselerzeugung für den Diffie-Hellman (DH)-Schlüsselaustausch. Die Verwendung des DH-Schlüsselaustauschs verbessert die Forward Secrecy auf Kosten von Rechenressourcen (sowohl auf dem Server als auch auf dem Client). Der Parameter dhfile sollte der Pfad zu einer Datei sein, die DH-Parameter im PEM-Format enthält.
Diese Einstellung gilt nicht für Client-Sockets. Sie können auch die Option
OP_SINGLE_DH_USEverwenden, um die Sicherheit weiter zu verbessern.Hinzugefügt in Version 3.3.
- SSLContext.set_ecdh_curve(curve_name, /)¶
Setzen Sie den Kurvennamen für den Elliptische Kurven-basierten Diffie-Hellman (ECDH)-Schlüsselaustausch. ECDH ist deutlich schneller als reguläres DH und dabei wohl genauso sicher. Der Parameter curve_name sollte eine Zeichenkette sein, die eine bekannte elliptische Kurve beschreibt, z. B.
prime256v1für eine weit verbreitete Kurve.Diese Einstellung gilt nicht für Client-Sockets. Sie können auch die Option
OP_SINGLE_ECDH_USEverwenden, um die Sicherheit weiter zu verbessern.Diese Methode ist nicht verfügbar, wenn
HAS_ECDHFalseist.Hinzugefügt in Version 3.3.
Siehe auch
- SSL/TLS & Perfect Forward Secrecy
Vincent Bernat.
- SSLContext.wrap_socket(sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None)¶
Umschließen Sie einen vorhandenen Python-Socket sock und geben Sie eine Instanz von
SSLContext.sslsocket_class(standardmäßigSSLSocket) zurück. Der zurückgegebene SSL-Socket ist an den Kontext, seine Einstellungen und Zertifikate gebunden. sock muss einSOCK_STREAM-Socket sein; andere Socket-Typen werden nicht unterstützt.Der Parameter
server_sideist ein boolescher Wert, der angibt, ob für diesen Socket ein serverseitiges oder clientseitiges Verhalten gewünscht ist.Für clientseitige Sockets erfolgt die Konstruktion des Kontexts verzögert. Wenn der zugrunde liegende Socket noch nicht verbunden ist, wird die Konstruktion des Kontexts nach dem Aufruf von
connect()für den Socket durchgeführt. Für serverseitige Sockets wird, wenn der Socket keinen entfernten Peer hat, angenommen, dass es sich um einen lauschenden Socket handelt, und das serverseitige SSL-Wrapping wird automatisch bei Client-Verbindungen durchgeführt, die über die Methodeaccept()akzeptiert werden. Die Methode kannSSLErrorauslösen.Bei Client-Verbindungen gibt der optionale Parameter server_hostname den Hostnamen des Dienstes an, mit dem wir uns verbinden. Dies ermöglicht einem einzelnen Server, mehrere SSL-basierte Dienste mit unterschiedlichen Zertifikaten zu hosten, ähnlich wie bei HTTP-virtuellen Hosts. Die Angabe von server_hostname löst einen
ValueErroraus, wenn server_side true ist.Der Parameter
do_handshake_on_connectgibt an, ob der SSL-Handshake nach dem Aufruf vonsocket.connect()automatisch durchgeführt werden soll oder ob das Anwendungsprogramm ihn explizit durch Aufruf der MethodeSSLSocket.do_handshake()aufruft. Der explizite Aufruf vonSSLSocket.do_handshake()gibt dem Programm die Kontrolle über das blockierende Verhalten der Socket-I/O, die am Handshake beteiligt ist.Der Parameter
suppress_ragged_eofsgibt an, wie die MethodeSSLSocket.recv()unerwartete EOFs vom anderen Ende der Verbindung signalisieren soll. Wenn er aufTrue(Standard) gesetzt ist, gibt er einen normalen EOF (ein leeres Bytes-Objekt) als Reaktion auf unerwartete EOF-Fehler aus dem zugrunde liegenden Socket zurück; wenn er aufFalsegesetzt ist, werden die Ausnahmen an den Aufrufer zurückgegeben.session, siehe
session.Um einen
SSLSocketin einen anderenSSLSocketzu wrappen, verwenden SieSSLContext.wrap_bio().Geändert in Version 3.5: Erlaubt immer die Übergabe eines server_hostname, auch wenn OpenSSL kein SNI hat.
Geändert in Version 3.6: Das Argument session wurde hinzugefügt.
Geändert in Version 3.7: Die Methode gibt eine Instanz von
SSLContext.sslsocket_classanstelle eines hartcodiertenSSLSocketzurück.
- SSLContext.sslsocket_class¶
Der Rückgabetyp von
SSLContext.wrap_socket(), standardmäßigSSLSocket. Das Attribut kann auf Instanzen vonSSLContextzugewiesen werden, um eine benutzerdefinierte Unterklasse vonSSLSocketzurückzugeben.Hinzugefügt in Version 3.7.
- SSLContext.wrap_bio(incoming, outgoing, server_side=False, server_hostname=None, session=None)¶
Wickeln Sie die BIO-Objekte incoming und outgoing und geben Sie eine Instanz von
SSLContext.sslobject_class(standardmäßigSSLObject) zurück. Die SSL-Routinen lesen Eingabedaten aus dem eingehenden BIO und schreiben Daten in das ausgehende BIO.Die Parameter server_side, server_hostname und session haben die gleiche Bedeutung wie in
SSLContext.wrap_socket().Geändert in Version 3.6: Das Argument session wurde hinzugefügt.
Geändert in Version 3.7: Die Methode gibt eine Instanz von
SSLContext.sslobject_classanstelle eines hartcodiertenSSLObjectzurück.
- SSLContext.sslobject_class¶
Der Rückgabetyp von
SSLContext.wrap_bio(), standardmäßigSSLObject. Das Attribut kann auf Instanzen der Klasse überschrieben werden, um eine benutzerdefinierte Unterklasse vonSSLObjectzurückzugeben.Hinzugefügt in Version 3.7.
- SSLContext.session_stats()¶
Rufen Sie Statistiken über die von diesem Kontext erstellten oder verwalteten SSL-Sitzungen ab. Es wird ein Dictionary zurückgegeben, das die Namen jeder Informationskomponente ihren numerischen Werten zuordnet. Hier ist zum Beispiel die Gesamtzahl der Treffer und Fehlschläge im Sitzungscache seit der Erstellung des Kontexts
>>> stats = context.session_stats() >>> stats['hits'], stats['misses'] (0, 0)
- SSLContext.check_hostname¶
Ob, ob das Zertifikat des Peers im Hostnamen in
SSLSocket.do_handshake()übereinstimmen soll. Derverify_modedes Kontexts muss aufCERT_OPTIONALoderCERT_REQUIREDgesetzt werden, und Sie müssen server_hostname anwrap_socket()übergeben, um den Hostnamen abzugleichen. Das Aktivieren der Hostnamenprüfung setzt automatischverify_modevonCERT_NONEaufCERT_REQUIRED. Es kann nicht aufCERT_NONEzurückgesetzt werden, solange die Hostnamenprüfung aktiviert ist. DasPROTOCOL_TLS_CLIENT-Protokoll aktiviert die Hostnamenprüfung standardmäßig. Bei anderen Protokollen muss die Hostnamenprüfung explizit aktiviert werden.Beispiel
import socket, ssl context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) context.verify_mode = ssl.CERT_REQUIRED context.check_hostname = True context.load_default_certs() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com') ssl_sock.connect(('www.verisign.com', 443))
Hinzugefügt in Version 3.4.
Geändert in Version 3.7:
verify_modewird nun automatisch aufCERT_REQUIREDgeändert, wenn die Hostnamenprüfung aktiviert ist undverify_modeCERT_NONEist. Zuvor wäre dieselbe Operation mit einemValueErrorfehlgeschlagen.
- SSLContext.keylog_filename¶
Schreibt TLS-Schlüssel in eine Keylog-Datei, wann immer Schlüsselmaterial generiert oder empfangen wird. Die Keylog-Datei ist nur für Debugging-Zwecke bestimmt. Das Dateiformat wird von NSS spezifiziert und von vielen Traffic-Analysatoren wie Wireshark verwendet. Die Logdatei wird im Nur-Anhängen-Modus geöffnet. Schreibvorgänge werden zwischen Threads synchronisiert, aber nicht zwischen Prozessen.
Hinzugefügt in Version 3.8.
- SSLContext.maximum_version¶
Ein Mitglied der
TLSVersion-Aufzählung, das die höchste unterstützte TLS-Version darstellt. Der Wert ist standardmäßigTLSVersion.MAXIMUM_SUPPORTED. Das Attribut ist schreibgeschützt für andere Protokolle alsPROTOCOL_TLS,PROTOCOL_TLS_CLIENTundPROTOCOL_TLS_SERVER.Die Attribute
maximum_version,minimum_versionundSSLContext.optionswirken sich alle auf die unterstützten SSL- und TLS-Versionen des Kontexts aus. Die Implementierung verhindert keine ungültige Kombination. Zum Beispiel wird ein Kontext mitOP_NO_TLSv1_2inoptionsundmaximum_versionaufTLSVersion.TLSv1_2gesetzt, keine TLS 1.2-Verbindung herstellen können.Hinzugefügt in Version 3.7.
- SSLContext.minimum_version¶
Wie
SSLContext.maximum_version, außer dass es die niedrigste unterstützte Version oderTLSVersion.MINIMUM_SUPPORTEDist.Hinzugefügt in Version 3.7.
- SSLContext.num_tickets¶
Kontrolliert die Anzahl der TLS 1.3-Sitzungstickets eines
PROTOCOL_TLS_SERVER-Kontexts. Die Einstellung hat keine Auswirkung auf TLS 1.0 bis 1.2-Verbindungen.Hinzugefügt in Version 3.8.
- SSLContext.options¶
Eine Ganzzahl, die die Menge der im Kontext aktivierten SSL-Optionen darstellt. Der Standardwert ist
OP_ALL, aber Sie können andere Optionen wieOP_NO_SSLv2durch ODER-Verknüpfung angeben.Geändert in Version 3.6:
SSLContext.optionsgibtOptions-Flags zurück>>> ssl.create_default_context().options <Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>
Veraltet seit Version 3.7: Alle Optionen
OP_NO_SSL*undOP_NO_TLS*sind seit Python 3.7 veraltet. Verwenden Sie stattdessenSSLContext.minimum_versionundSSLContext.maximum_version.
- SSLContext.post_handshake_auth¶
Aktiviert die TLS 1.3-Clientauthentifizierung nach dem Handshake. Post-Handshake-Authentifizierung ist standardmäßig deaktiviert, und ein Server kann während des initialen Handshakes ein TLS-Clientzertifikat anfordern. Wenn aktiviert, kann ein Server jederzeit nach dem Handshake ein TLS-Clientzertifikat anfordern.
Wenn auf clientseitigen Sockets aktiviert, signalisiert der Client dem Server, dass er die Post-Handshake-Authentifizierung unterstützt.
Wenn auf serverseitigen Sockets aktiviert, muss
SSLContext.verify_modeebenfalls aufCERT_OPTIONALoderCERT_REQUIREDgesetzt sein. Der tatsächliche Client-Zertifikataustausch wird bis zum Aufruf vonSSLSocket.verify_client_post_handshake()und der Durchführung von I/O verzögert.Hinzugefügt in Version 3.8.
- SSLContext.protocol¶
Die beim Erstellen des Kontexts ausgewählte Protokollversion. Dieses Attribut ist schreibgeschützt.
- SSLContext.hostname_checks_common_name¶
Ob
check_hostnameauf die Überprüfung des Common Name des Zertifikatsubjekts zurückfällt, wenn keine Subject Alternative Name-Erweiterung vorhanden ist (Standard: true).Hinzugefügt in Version 3.7.
Geändert in Version 3.10: Das Flag hatte vor Version 1.1.1l von OpenSSL keine Auswirkung. Python 3.8.9, 3.9.3 und 3.10 enthalten Workarounds für frühere Versionen.
- SSLContext.security_level¶
Eine Ganzzahl, die die Sicherheitsstufe für den Kontext darstellt. Dieses Attribut ist schreibgeschützt.
Hinzugefügt in Version 3.10.
- SSLContext.verify_flags¶
Die Flags für Zertifikatsüberprüfungsoperationen. Sie können Flags wie
VERIFY_CRL_CHECK_LEAFdurch ODER-Verknüpfung setzen. Standardmäßig verlangt und überprüft OpenSSL keine Certificate Revocation Lists (CRLs).Hinzugefügt in Version 3.4.
Geändert in Version 3.6:
SSLContext.verify_flagsgibtVerifyFlags-Flags zurück>>> ssl.create_default_context().verify_flags <VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>
- SSLContext.verify_mode¶
Ob die Zertifikate anderer Peers überprüft werden sollen und wie zu verhalten ist, wenn die Überprüfung fehlschlägt. Dieses Attribut muss einer der folgenden Werte sein:
CERT_NONE,CERT_OPTIONALoderCERT_REQUIRED.Geändert in Version 3.6:
SSLContext.verify_modegibtVerifyMode-Enumerationswerte zurück>>> ssl.create_default_context().verify_mode <VerifyMode.CERT_REQUIRED: 2>
- SSLContext.set_psk_client_callback(callback)¶
Aktiviert TLS-PSK (Pre-Shared Key) Authentifizierung bei einer clientseitigen Verbindung.
Im Allgemeinen sollte die zertifikatsbasierte Authentifizierung dieser Methode vorgezogen werden.
Der Parameter
callbackist ein aufrufbares Objekt mit der Signatur:def callback(hint: str | None) -> tuple[str | None, bytes]. Der Parameterhintist ein optionaler Identitätshinweis, der vom Server gesendet wird. Der Rückgabewert ist ein Tupel im Format (client-identity, psk). Client-identity ist eine optionale Zeichenkette, die vom Server verwendet werden kann, um eine entsprechende PSK für den Client auszuwählen. Die Zeichenkette darf bei UTF-8-Kodierung maximal256Oktette lang sein. PSK ist ein bytes-ähnliches Objekt, das den Pre-Shared Key darstellt. Geben Sie eine PSK der Länge Null zurück, um die Verbindung abzulehnen.Das Setzen von
callbackaufNoneentfernt jeden vorhandenen Callback.Hinweis
Bei Verwendung von TLS 1.3
ist der Parameter
hintimmerNone.client-identity muss eine nicht leere Zeichenkette sein.
Beispielverwendung
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.check_hostname = False context.verify_mode = ssl.CERT_NONE context.maximum_version = ssl.TLSVersion.TLSv1_2 context.set_ciphers('PSK') # A simple lambda: psk = bytes.fromhex('c0ffee') context.set_psk_client_callback(lambda hint: (None, psk)) # A table using the hint from the server: psk_table = { 'ServerId_1': bytes.fromhex('c0ffee'), 'ServerId_2': bytes.fromhex('facade') } def callback(hint): return 'ClientId_1', psk_table.get(hint, b'') context.set_psk_client_callback(callback)
Diese Methode löst
NotImplementedErroraus, wennHAS_PSKFalseist.Hinzugefügt in Version 3.13.
- SSLContext.set_psk_server_callback(callback, identity_hint=None)¶
Aktiviert TLS-PSK (Pre-Shared Key) Authentifizierung bei einer serverseitigen Verbindung.
Im Allgemeinen sollte die zertifikatsbasierte Authentifizierung dieser Methode vorgezogen werden.
Der Parameter
callbackist ein aufrufbares Objekt mit der Signatur:def callback(identity: str | None) -> bytes. Der Parameteridentityist eine optionale Identität, die vom Client gesendet wird und zur Auswahl einer entsprechenden PSK verwendet werden kann. Der Rückgabewert ist ein bytes-ähnliches Objekt, das den Pre-Shared Key darstellt. Geben Sie eine PSK der Länge Null zurück, um die Verbindung abzulehnen.Das Setzen von
callbackaufNoneentfernt jeden vorhandenen Callback.Der Parameter
identity_hintist eine optionale Identitätshinweis-Zeichenkette, die an den Client gesendet wird. Die Zeichenkette darf bei UTF-8-Kodierung maximal256Oktette lang sein.Hinweis
Bei Verwendung von TLS 1.3 wird der Parameter
identity_hintnicht an den Client gesendet.Beispielverwendung
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.maximum_version = ssl.TLSVersion.TLSv1_2 context.set_ciphers('PSK') # A simple lambda: psk = bytes.fromhex('c0ffee') context.set_psk_server_callback(lambda identity: psk) # A table using the identity of the client: psk_table = { 'ClientId_1': bytes.fromhex('c0ffee'), 'ClientId_2': bytes.fromhex('facade') } def callback(identity): return psk_table.get(identity, b'') context.set_psk_server_callback(callback, 'ServerId_1')
Diese Methode löst
NotImplementedErroraus, wennHAS_PSKFalseist.Hinzugefügt in Version 3.13.
Zertifikate¶
Zertifikate sind im Allgemeinen Teil eines öffentlichen/privaten Schlüsselsystems. In diesem System wird jedem Teilnehmer (der eine Maschine, eine Person oder eine Organisation sein kann) ein eindeutiger zweiteiliger Verschlüsselungsschlüssel zugewiesen. Ein Teil des Schlüssels ist öffentlich und wird als öffentlicher Schlüssel bezeichnet; der andere Teil wird geheim gehalten und als privater Schlüssel bezeichnet. Die beiden Teile sind so miteinander verbunden, dass, wenn Sie eine Nachricht mit einem der Teile verschlüsseln, Sie sie mit dem anderen Teil entschlüsseln können, und zwar **nur** mit dem anderen Teil.
Ein Zertifikat enthält Informationen über zwei Teilnehmer. Es enthält den Namen eines Subjekts und den öffentlichen Schlüssel des Subjekts. Es enthält auch eine Aussage eines zweiten Teilnehmers, des Ausstellers, dass das Subjekt derjenige ist, der es vorgibt zu sein, und dass dies tatsächlich der öffentliche Schlüssel des Subjekts ist. Die Aussage des Ausstellers ist mit dem privaten Schlüssel des Ausstellers signiert, den nur der Aussteller kennt. Jeder kann jedoch die Aussage des Ausstellers überprüfen, indem er den öffentlichen Schlüssel des Ausstellers findet, die Aussage damit entschlüsselt und sie mit den anderen Informationen im Zertifikat vergleicht. Das Zertifikat enthält auch Informationen über den Zeitraum, über den es gültig ist. Dies wird durch zwei Felder ausgedrückt, die "notBefore" und "notAfter" genannt werden.
In der Python-Verwendung von Zertifikaten kann ein Client oder Server ein Zertifikat verwenden, um seine Identität nachzuweisen. Die andere Seite einer Netzwerkverbindung kann auch aufgefordert werden, ein Zertifikat vorzulegen, und dieses Zertifikat kann zur Zufriedenheit des Clients oder Servers, der eine solche Überprüfung verlangt, validiert werden. Die Verbindungsanfrage kann so eingestellt werden, dass eine Ausnahme ausgelöst wird, wenn die Validierung fehlschlägt. Die Validierung wird automatisch vom zugrunde liegenden OpenSSL-Framework durchgeführt; die Anwendung muss sich nicht um deren Mechanik kümmern. Aber die Anwendung muss normalerweise Sätze von Zertifikaten bereitstellen, um diesen Prozess zu ermöglichen.
Python verwendet Dateien zur Speicherung von Zertifikaten. Sie sollten im "PEM"-Format vorliegen (siehe RFC 1422), was einer Base-64-kodierten Form entspricht, die mit einer Kopfzeile und einer Fußzeile umschlossen ist.
-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----
Zertifikatsketten¶
Die Python-Dateien, die Zertifikate enthalten, können eine Sequenz von Zertifikaten enthalten, die manchmal als Zertifikatskette bezeichnet wird. Diese Kette sollte mit dem spezifischen Zertifikat für den Teilnehmer beginnen, der der Client oder Server "ist", dann dem Zertifikat des Ausstellers dieses Zertifikats und dann dem Zertifikat des Ausstellers dieses Zertifikats und so weiter die Kette hinauf, bis Sie zu einem Zertifikat gelangen, das selbstsigniert ist, d. h. ein Zertifikat, das denselben Betreff und Aussteller hat, manchmal auch als Stammzertifikat bezeichnet. Die Zertifikate sollten einfach in der Zertifikatsdatei verkettet werden. Angenommen, wir hätten eine dreifache Zertifikatskette, vom Serverzertifikat zum Zertifikat der Zertifizierungsstelle, die unser Serverzertifikat signiert hat, zum Stammzertifikat der Behörde, die das Zertifikat der Zertifizierungsstelle ausgestellt hat.
-----BEGIN CERTIFICATE-----
... (certificate for your server)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the certificate for the CA)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the root certificate for the CA's issuer)...
-----END CERTIFICATE-----
CA-Zertifikate¶
Wenn Sie die Überprüfung des Zertifikats der anderen Seite der Verbindung verlangen möchten, müssen Sie eine "CA-Zertifikate"-Datei bereitstellen, die mit den Zertifikatsketten für jeden Aussteller gefüllt ist, dem Sie vertrauen möchten. Auch diese Datei enthält nur diese verketteten Ketten. Für die Validierung verwendet Python die erste Kette, die es in der Datei findet und die übereinstimmt. Die Zertifikatsdatei der Plattform kann durch Aufrufen von SSLContext.load_default_certs() verwendet werden, dies geschieht automatisch mit create_default_context().
Kombinierter Schlüssel und Zertifikat¶
Oft ist der private Schlüssel in derselben Datei wie das Zertifikat gespeichert; in diesem Fall muss nur der Parameter certfile an SSLContext.load_cert_chain() übergeben werden. Wenn der private Schlüssel zusammen mit dem Zertifikat gespeichert ist, sollte er vor dem ersten Zertifikat in der Zertifikatskette stehen.
-----BEGIN RSA PRIVATE KEY-----
... (private key in base64 encoding) ...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----
Selbstsignierte Zertifikate¶
Wenn Sie einen Server erstellen, der SSL-verschlüsselte Verbindungsdienste anbietet, benötigen Sie ein Zertifikat für diesen Dienst. Es gibt viele Möglichkeiten, geeignete Zertifikate zu erwerben, z. B. indem Sie eines von einer Zertifizierungsstelle kaufen. Eine weitere gängige Praxis ist die Generierung eines selbstsignierten Zertifikats. Der einfachste Weg, dies zu tun, ist mit dem OpenSSL-Paket, indem Sie etwas wie das Folgende verwenden.
% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
Generating a 1024 bit RSA private key
.......++++++
.............................++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:MyState
Locality Name (eg, city) []:Some City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
Organizational Unit Name (eg, section) []:My Group
Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
Email Address []:ops@myserver.mygroup.myorganization.com
%
Der Nachteil eines selbstsignierten Zertifikats ist, dass es sein eigenes Stammzertifikat ist und niemand sonst es in seinem Cache bekannter (und vertrauenswürdiger) Stammzertifikate haben wird.
Beispiele¶
SSL-Unterstützung testen¶
Um die Anwesenheit von SSL-Unterstützung in einer Python-Installation zu testen, sollte der Benutzercode die folgende Idiomatik verwenden.
try:
import ssl
except ImportError:
pass
else:
... # do something that requires SSL support
Clientseitiger Betrieb¶
Dieses Beispiel erstellt einen SSL-Kontext mit den empfohlenen Sicherheitseinstellungen für Client-Sockets, einschließlich der automatischen Zertifikatsüberprüfung.
>>> context = ssl.create_default_context()
Wenn Sie die Sicherheitseinstellungen lieber selbst abstimmen möchten, können Sie einen Kontext von Grund auf neu erstellen (aber seien Sie vorsichtig, dass Sie die Einstellungen möglicherweise nicht richtig vornehmen).
>>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
(Dieses Snippet geht davon aus, dass Ihr Betriebssystem ein Bündel aller CA-Zertifikate unter /etc/ssl/certs/ca-bundle.crt ablegt; wenn nicht, erhalten Sie einen Fehler und müssen den Speicherort anpassen)
Das Protokoll PROTOCOL_TLS_CLIENT konfiguriert den Kontext für Zertifikatsvalidierung und Hostnamenüberprüfung. verify_mode wird auf CERT_REQUIRED und check_hostname auf True gesetzt. Alle anderen Protokolle erstellen SSL-Kontexte mit unsicheren Standardeinstellungen.
Wenn Sie den Kontext zum Verbinden mit einem Server verwenden, validieren CERT_REQUIRED und check_hostname das Serverzertifikat: es stellt sicher, dass das Serverzertifikat mit einem der CA-Zertifikate signiert wurde, prüft die Signatur auf Korrektheit und validiert andere Eigenschaften wie Gültigkeit und Identität des Hostnamens.
>>> conn = context.wrap_socket(socket.socket(socket.AF_INET),
... server_hostname="www.python.org")
>>> conn.connect(("www.python.org", 443))
Sie können dann das Zertifikat abrufen.
>>> cert = conn.getpeercert()
Die visuelle Inspektion zeigt, dass das Zertifikat den gewünschten Dienst identifiziert (d. h. den HTTPS-Host www.python.org).
>>> pprint.pprint(cert)
{'OCSP': ('http://ocsp.digicert.com',),
'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),
'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',
'http://crl4.digicert.com/sha2-ev-server-g1.crl'),
'issuer': ((('countryName', 'US'),),
(('organizationName', 'DigiCert Inc'),),
(('organizationalUnitName', 'www.digicert.com'),),
(('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),
'notAfter': 'Sep 9 12:00:00 2016 GMT',
'notBefore': 'Sep 5 00:00:00 2014 GMT',
'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',
'subject': ((('businessCategory', 'Private Organization'),),
(('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
(('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
(('serialNumber', '3359300'),),
(('streetAddress', '16 Allen Rd'),),
(('postalCode', '03894-4801'),),
(('countryName', 'US'),),
(('stateOrProvinceName', 'NH'),),
(('localityName', 'Wolfeboro'),),
(('organizationName', 'Python Software Foundation'),),
(('commonName', 'www.python.org'),)),
'subjectAltName': (('DNS', 'www.python.org'),
('DNS', 'python.org'),
('DNS', 'pypi.org'),
('DNS', 'docs.python.org'),
('DNS', 'testpypi.org'),
('DNS', 'bugs.python.org'),
('DNS', 'wiki.python.org'),
('DNS', 'hg.python.org'),
('DNS', 'mail.python.org'),
('DNS', 'packaging.python.org'),
('DNS', 'pythonhosted.org'),
('DNS', 'www.pythonhosted.org'),
('DNS', 'test.pythonhosted.org'),
('DNS', 'us.pycon.org'),
('DNS', 'id.python.org')),
'version': 3}
Nun ist der SSL-Kanal eingerichtet und das Zertifikat verifiziert, Sie können mit dem Server kommunizieren.
>>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
>>> pprint.pprint(conn.recv(1024).split(b"\r\n"))
[b'HTTP/1.1 200 OK',
b'Date: Sat, 18 Oct 2014 18:27:20 GMT',
b'Server: nginx',
b'Content-Type: text/html; charset=utf-8',
b'X-Frame-Options: SAMEORIGIN',
b'Content-Length: 45679',
b'Accept-Ranges: bytes',
b'Via: 1.1 varnish',
b'Age: 2188',
b'X-Served-By: cache-lcy1134-LCY',
b'X-Cache: HIT',
b'X-Cache-Hits: 11',
b'Vary: Cookie',
b'Strict-Transport-Security: max-age=63072000; includeSubDomains',
b'Connection: close',
b'',
b'']
Siehe die Diskussion der Sicherheitsüberlegungen unten.
Serverseitiger Betrieb¶
Für den Serverbetrieb benötigen Sie normalerweise ein Serverzertifikat und einen privaten Schlüssel, beide in einer Datei. Sie erstellen zuerst einen Kontext, der den Schlüssel und das Zertifikat enthält, damit Clients Ihre Authentizität überprüfen können. Dann öffnen Sie einen Socket, binden ihn an einen Port, rufen listen() darauf auf und beginnen, auf Client-Verbindungen zu warten.
import socket, ssl
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")
bindsocket = socket.socket()
bindsocket.bind(('myaddr.example.com', 10023))
bindsocket.listen(5)
Wenn sich ein Client verbindet, rufen Sie accept() auf dem Socket auf, um den neuen Socket vom anderen Ende zu erhalten, und verwenden die Methode SSLContext.wrap_socket() des Kontexts, um einen serverseitigen SSL-Socket für die Verbindung zu erstellen.
while True:
newsocket, fromaddr = bindsocket.accept()
connstream = context.wrap_socket(newsocket, server_side=True)
try:
deal_with_client(connstream)
finally:
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
Dann lesen Sie Daten aus dem connstream und tun etwas damit, bis Sie mit dem Client fertig sind (oder der Client mit Ihnen fertig ist).
def deal_with_client(connstream):
data = connstream.recv(1024)
# empty data means the client is finished with us
while data:
if not do_something(connstream, data):
# we'll assume do_something returns False
# when we're finished with client
break
data = connstream.recv(1024)
# finished with client
Und gehen Sie zurück, um auf neue Client-Verbindungen zu lauschen (natürlich würde ein echter Server wahrscheinlich jede Client-Verbindung in einem separaten Thread behandeln oder die Sockets in den Nicht-Blockierungsmodus versetzen und eine Ereignisschleife verwenden).
Hinweise zu Nicht-Blockierenden Sockets¶
SSL-Sockets verhalten sich im Nicht-Blockierungsmodus etwas anders als reguläre Sockets. Bei der Arbeit mit Nicht-Blockierenden Sockets gibt es daher mehrere Dinge zu beachten.
Die meisten Methoden von
SSLSocketlösen entwederSSLWantWriteErroroderSSLWantReadErroranstelle vonBlockingIOErroraus, wenn eine I/O-Operation blockieren würde.SSLWantReadErrorwird ausgelöst, wenn ein Lesevorgang am zugrunde liegenden Socket erforderlich ist, undSSLWantWriteErrorfür einen Schreibvorgang am zugrunde liegenden Socket. Beachten Sie, dass Schreibversuche auf einen SSL-Socket möglicherweise zuerst das Lesen vom zugrunde liegenden Socket erfordern, und Leseversuche vom SSL-Socket möglicherweise ein vorheriges Schreiben an den zugrunde liegenden Socket erfordern.Geändert in Version 3.5: In früheren Python-Versionen gab die Methode
SSLSocket.send()null zurück, anstattSSLWantWriteErroroderSSLWantReadErrorauszulösen.Das Aufrufen von
select()teilt Ihnen mit, dass der Socket auf Betriebssystemebene gelesen (oder geschrieben) werden kann, impliziert aber nicht, dass genügend Daten auf der oberen SSL-Schicht vorhanden sind. Es könnte beispielsweise nur ein Teil eines SSL-Frames angekommen sein. Daher müssen Sie bereit sein, Fehler beiSSLSocket.recv()undSSLSocket.send()zu behandeln und nach einem weiteren Aufruf vonselect()erneut zu versuchen.Umgekehrt kann ein SSL-Socket, da die SSL-Schicht ihre eigene Rahmung hat, noch Daten zum Lesen verfügbar haben, ohne dass
select()davon Kenntnis hat. Daher sollten Sie zuerstSSLSocket.recv()aufrufen, um alle potenziell verfügbaren Daten zu entleeren, und dann nur bei einem Aufruf vonselect()blockieren, wenn dies immer noch notwendig ist.(natürlich gelten ähnliche Bestimmungen bei der Verwendung anderer Primitiven wie
poll()oder der im Modulselectors)Der SSL-Handshake selbst ist nicht blockierend: die Methode
SSLSocket.do_handshake()muss wiederholt aufgerufen werden, bis sie erfolgreich zurückkehrt. Hier ist eine Übersicht, dieselect()verwendet, um auf die Bereitschaft des Sockets zu warten.while True: try: sock.do_handshake() break except ssl.SSLWantReadError: select.select([sock], [], []) except ssl.SSLWantWriteError: select.select([], [sock], [])
Siehe auch
Das Modul asyncio unterstützt Nicht-Blockierende SSL-Sockets und bietet eine höherrangige Streams API. Es pollt auf Ereignisse über das Modul selectors und behandelt Ausnahmen vom Typ SSLWantWriteError, SSLWantReadError und BlockingIOError. Es führt auch den SSL-Handshake asynchron aus.
Unterstützung für Memory BIOs¶
Hinzugefügt in Version 3.5.
Seit der Einführung des SSL-Moduls in Python 2.6 bietet die Klasse SSLSocket zwei verwandte, aber unterschiedliche Funktionsbereiche.
SSL-Protokollbehandlung
Netzwerk-IO
Die Netzwerk-IO-API ist identisch mit der von socket.socket, von der SSLSocket ebenfalls erbt. Dies ermöglicht die Verwendung eines SSL-Sockets als Drop-in-Ersatz für einen regulären Socket, wodurch es sehr einfach ist, einer bestehenden Anwendung SSL-Unterstützung hinzuzufügen.
Die Kombination von SSL-Protokollbehandlung und Netzwerk-IO funktioniert im Allgemeinen gut, aber es gibt einige Fälle, in denen dies nicht der Fall ist. Ein Beispiel sind asynchrone IO-Frameworks, die ein anderes IO-Multiplexing-Modell als das "select/poll auf einem Dateideskriptor" (bereitschaftsbasiert) Modell verwenden möchten, das von socket.socket und den internen OpenSSL-Socket-IO-Routinen angenommen wird. Dies ist hauptsächlich auf Plattformen wie Windows relevant, wo dieses Modell nicht effizient ist. Zu diesem Zweck wird eine reduzierte Variante von SSLSocket namens SSLObject bereitgestellt.
- class ssl.SSLObject¶
Eine Variante mit reduziertem Umfang von
SSLSocket, die eine SSL-Protokollinstanz darstellt, die keine Netzwerk-IO-Methoden enthält. Diese Klasse wird typischerweise von Framework-Autoren verwendet, die asynchrone IO für SSL über Speicherpuffer implementieren möchten.Diese Klasse implementiert eine Schnittstelle über einem Low-Level-SSL-Objekt, wie es von OpenSSL implementiert wird. Dieses Objekt erfasst den Zustand einer SSL-Verbindung, bietet aber keine eigene Netzwerk-IO. IO muss über separate "BIO"-Objekte durchgeführt werden, die die IO-Abstraktionsschicht von OpenSSL darstellen.
Diese Klasse hat keinen öffentlichen Konstruktor. Eine Instanz von
SSLObjectmuss mit der Methodewrap_bio()erstellt werden. Diese Methode erstellt die Instanz vonSSLObjectund bindet sie an ein Paar von BIOs. Das *eingehende* BIO wird verwendet, um Daten von Python an die SSL-Protokollinstanz zu übergeben, während das *ausgehende* BIO verwendet wird, um Daten in die entgegengesetzte Richtung zu übergeben.Die folgenden Methoden sind verfügbar
Im Vergleich zu
SSLSocketfehlen diesem Objekt folgende FunktionenJede Form von Netzwerk-IO;
recv()undsend()lesen und schreiben nur in die zugrunde liegendenMemoryBIO-Puffer.Es gibt keine do_handshake_on_connect-Mechanismen. Sie müssen immer manuell
do_handshake()aufrufen, um den Handshake zu starten.Es gibt keine Behandlung von suppress_ragged_eofs. Alle End-of-File-Bedingungen, die gegen das Protokoll verstoßen, werden über die Ausnahme
SSLEOFErrorgemeldet.Der Aufruf der Methode
unwrap()gibt nichts zurück, im Gegensatz zu einem SSL-Socket, bei dem er den zugrunde liegenden Socket zurückgibt.Der an
SSLContext.set_servername_callback()übergebene Callback server_name_callback erhält als ersten Parameter eine Instanz vonSSLObjectanstelle einer Instanz vonSSLSocket.
Einige Hinweise zur Verwendung von
SSLObjectAlle I/O-Operationen auf einem
SSLObjectsind nicht-blockierend. Das bedeutet, dass beispielsweiseread()eineSSLWantReadErrorauslöst, wenn mehr Daten benötigt werden, als im eingehenden BIO verfügbar sind.
Geändert in Version 3.7:
SSLObject-Instanzen müssen mitwrap_bio()erstellt werden. In früheren Versionen war es möglich, Instanzen direkt zu erstellen. Dies wurde nie dokumentiert oder offiziell unterstützt.
Ein SSLObject kommuniziert mit der Außenwelt über Speicherpuffer. Die Klasse MemoryBIO stellt einen Speicherpuffer zur Verfügung, der für diesen Zweck verwendet werden kann. Er wickelt ein OpenSSL-Speicher-BIO (Basic IO)-Objekt ein
- class ssl.MemoryBIO¶
Ein Speicherpuffer, der verwendet werden kann, um Daten zwischen Python und einer SSL-Protokollinstanz zu übergeben.
- pending¶
Gibt die Anzahl der Bytes zurück, die sich derzeit im Speicherpuffer befinden.
- eof¶
Ein boolescher Wert, der angibt, ob sich das Speicher-BIO derzeit an der End-of-File-Position befindet.
- read(n=-1, /)¶
Liest bis zu n Bytes aus dem Speicherpuffer. Wenn n nicht angegeben oder negativ ist, werden alle Bytes zurückgegeben.
- write(buf, /)¶
Schreibt die Bytes aus buf in das Speicher-BIO. Das Argument buf muss ein Objekt sein, das das Pufferprotokoll unterstützt.
Der Rückgabewert ist die Anzahl der geschriebenen Bytes, die immer der Länge von buf entspricht.
SSL-Sitzung¶
Hinzugefügt in Version 3.6.
Sicherheitsüberlegungen¶
Beste Standardwerte¶
Für die **Client-Nutzung** wird dringend empfohlen, wenn Sie keine speziellen Anforderungen an Ihre Sicherheitspolitik haben, die Funktion create_default_context() zu verwenden, um Ihren SSL-Kontext zu erstellen. Sie lädt die vertrauenswürdigen CA-Zertifikate des Systems, aktiviert die Zertifikatsvalidierung und die Hostnamenprüfung und versucht, angemessen sichere Protokoll- und Cipher-Einstellungen auszuwählen.
Beispielsweise, wie Sie die Klasse smtplib.SMTP verwenden würden, um eine vertrauenswürdige, sichere Verbindung zu einem SMTP-Server herzustellen
>>> import ssl, smtplib
>>> smtp = smtplib.SMTP("mail.python.org", port=587)
>>> context = ssl.create_default_context()
>>> smtp.starttls(context=context)
(220, b'2.0.0 Ready to start TLS')
Wenn für die Verbindung ein Client-Zertifikat benötigt wird, kann es mit SSLContext.load_cert_chain() hinzugefügt werden.
Wenn Sie hingegen den SSL-Kontext erstellen, indem Sie den Konstruktor SSLContext selbst aufrufen, sind standardmäßig keine Zertifikatsvalidierung oder Hostnamenprüfung aktiviert. Wenn Sie dies tun, lesen Sie bitte die folgenden Absätze, um ein gutes Sicherheitsniveau zu erreichen.
Manuelle Einstellungen¶
Zertifikate überprüfen¶
Beim direkten Aufruf des Konstruktors SSLContext ist CERT_NONE der Standard. Da die Gegenseite nicht authentifiziert wird, kann dies unsicher sein, insbesondere im Client-Modus, wo Sie meistens die Authentizität des Servers, mit dem Sie sprechen, sicherstellen möchten. Daher wird im Client-Modus dringend empfohlen, CERT_REQUIRED zu verwenden. Dies allein reicht jedoch nicht aus; Sie müssen auch überprüfen, ob das Serverzertifikat, das durch Aufrufen von SSLSocket.getpeercert() abgerufen werden kann, dem gewünschten Dienst entspricht. Für viele Protokolle und Anwendungen kann der Dienst durch den Hostnamen identifiziert werden. Diese gängige Prüfung wird automatisch durchgeführt, wenn SSLContext.check_hostname aktiviert ist.
Geändert in Version 3.7: Die Hostnamenabgleichung wird jetzt von OpenSSL durchgeführt. Python verwendet nicht mehr match_hostname().
Im Servermodus müssen Sie, wenn Sie Ihre Clients über die SSL-Schicht authentifizieren möchten (anstatt einen höherstufigen Authentifizierungsmechanismus zu verwenden), ebenfalls CERT_REQUIRED angeben und analog das Client-Zertifikat überprüfen.
Protokollversionen¶
SSL-Versionen 2 und 3 gelten als unsicher und sind daher gefährlich in der Anwendung. Wenn Sie maximale Kompatibilität zwischen Clients und Servern wünschen, wird empfohlen, PROTOCOL_TLS_CLIENT oder PROTOCOL_TLS_SERVER als Protokollversion zu verwenden. SSLv2 und SSLv3 sind standardmäßig deaktiviert.
>>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> client_context.minimum_version = ssl.TLSVersion.TLSv1_3
>>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3
Der oben erstellte SSL-Kontext erlaubt nur Verbindungen zu einem Server mit TLSv1.3 und höher (sofern von Ihrem System unterstützt). PROTOCOL_TLS_CLIENT impliziert standardmäßig die Zertifikatsvalidierung und Hostnamenprüfung. Sie müssen Zertifikate in den Kontext laden.
Cipher-Auswahl¶
Wenn Sie erweiterte Sicherheitsanforderungen haben, ist eine Feinabstimmung der Cipher, die bei der Aushandlung einer SSL-Sitzung aktiviert sind, über die Methode SSLContext.set_ciphers() möglich. Ab Python 3.2.3 deaktiviert das ssl-Modul bestimmte schwache Cipher standardmäßig, aber Sie möchten die Cipher-Auswahl möglicherweise weiter einschränken. Lesen Sie unbedingt die Dokumentation von OpenSSL zum Format der Cipher-Listen. Wenn Sie überprüfen möchten, welche Cipher von einer gegebenen Cipher-Liste aktiviert sind, verwenden Sie SSLContext.get_ciphers() oder den Befehl openssl ciphers auf Ihrem System.
Mehrprozessanwendung¶
Wenn Sie dieses Modul als Teil einer Mehrprozessanwendung verwenden (z. B. mit den Modulen multiprocessing oder concurrent.futures), beachten Sie, dass der interne Zufallszahlengenerator von OpenSSL mit geforkten Prozessen nicht richtig umgeht. Anwendungen müssen den PRNG-Zustand des Elternprozesses ändern, wenn sie SSL-Funktionen mit os.fork() verwenden. Jeder erfolgreiche Aufruf von RAND_add() oder RAND_bytes() ist ausreichend.
TLS 1.3¶
Hinzugefügt in Version 3.7.
Das TLS 1.3-Protokoll verhält sich etwas anders als frühere Versionen von TLS/SSL. Einige neue TLS 1.3-Funktionen sind noch nicht verfügbar.
TLS 1.3 verwendet einen getrennten Satz von Cipher-Suiten. Alle AES-GCM und ChaCha20 Cipher-Suiten sind standardmäßig aktiviert. Die Methode
SSLContext.set_ciphers()kann derzeit keine TLS 1.3-Cipher aktivieren oder deaktivieren, aberSSLContext.get_ciphers()gibt sie zurück.Sitzungstickets werden nicht mehr als Teil des anfänglichen Handshakes gesendet und anders behandelt.
SSLSocket.sessionundSSLSessionsind nicht mit TLS 1.3 kompatibel.Clientseitige Zertifikate werden während des anfänglichen Handshakes nicht mehr verifiziert. Ein Server kann jederzeit ein Zertifikat anfordern. Clients verarbeiten Zertifikatanfragen, während sie Anwendungsdaten an den Server senden oder von ihm empfangen.
TLS 1.3-Funktionen wie Early Data, verzögerte TLS-Client-Zertifikatanfrage, Konfiguration von Signatur-Algorithmen und Rekeying werden noch nicht unterstützt.
Siehe auch
- Klasse
socket.socket Dokumentation der zugrunde liegenden Klasse
socket- SSL/TLS starke Verschlüsselung: Eine Einführung
Einführung aus der Dokumentation des Apache HTTP Servers
- RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management
Steve Kent
- RFC 4086: Randomness Requirements for Security
Donald E., Jeffrey I. Schiller
- RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
D. Cooper
- RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2
T. Dierks et. al.
- RFC 6066: Transport Layer Security (TLS) Extensions
D. Eastlake
- IANA TLS: Transport Layer Security (TLS) Parameters
IANA
- RFC 7525: Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)
IETF
- Mozilla's Server Side TLS Recommendations
Mozilla