it-swarm.com.de

Zertifikatsüberprüfung fehlgeschlagen: Das Zertifikat des lokalen Ausstellers konnte nicht abgerufen werden

Ich versuche, mit Python Daten aus dem Web abzurufen. Ich habe das urllib.request-Paket dafür importiert, aber während der Ausführung erhalte ich folgende Fehlermeldung:

certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)

Wenn ich die URL in "http" geändert habe, kann ich Daten abrufen. Aber ich glaube, dies vermeidet die Überprüfung des SSL-Zertifikats.

Also habe ich im Internet nach einer Lösung gesucht: Run /Applications/Python\ 3.7/Install\ Certificates.command

Das hat mein Problem gelöst. Aber ich habe keine Kenntnisse über SSL und dergleichen. Können Sie mir helfen, zu verstehen, was es tatsächlich getan hat, um mein Problem zu lösen?.

Wenn möglich, empfehlen Sie mir eine gute Ressource, um mehr über die Sicherheit und Zertifikate zu erfahren. Das ist mir neu.

Vielen Dank!

Hinweis: Ich habe den Link durchgegangen - openssl, python fordert Fehler an: "Zertifikatsüberprüfung fehlgeschlagen"

Meine Frage unterscheidet sich von der im Link, weil ich wissen möchte, was tatsächlich passiert, wenn ich das certifi -Paket installiere oder Install\ Certificates.command, um den Fehler zu beheben. Ich habe ein schlechtes Verständnis von Wertpapieren.

20
Biswajit Paul

Ich habe dasselbe Problem unter OSX, während mein Code unter Linux völlig in Ordnung war, und Sie haben die Antwort in Ihrer Frage gegeben!

Nach der Überprüfung der Datei, auf die Sie /Applications/Python 3.7/Install Certificates.command Verwiesen haben, stellte sich heraus, dass dieser Befehl die Stammzertifikate der Standardinstallation Python) durch die Zertifikate ersetzt, die über die certifi Paket.

certifi ist eine Reihe von Stammzertifikaten. Jedes SSL-Zertifikat basiert auf einer Vertrauenskette: Sie vertrauen einem bestimmten Zertifikat, da Sie dem übergeordneten Zertifikat, dem Sie vertrauen, usw. vertrauen. Irgendwann gibt es kein übergeordnetes Zertifikat und dies sind Stammzertifikate. Für diese gibt es keine andere Lösung als das Bündeln von allgemein vertrauenswürdigen Stammzertifikaten (normalerweise große Trust-Unternehmen wie zB "DigiCert").

Sie können zum Beispiel die Stammzertifikate in den Sicherheitseinstellungen Ihres Browsers anzeigen (zum Beispiel für Firefox -> Einstellungen -> Datenschutz und Sicherheit -> Zertifikate anzeigen -> Autoritäten).

Wenn Sie zum ursprünglichen Problem zurückkehren und die Datei .command Ausführen, wird bei einer Neuinstallation eine leere Liste angezeigt:

import os
import ssl                                        
openssl_dir, openssl_cafile = os.path.split(      
    ssl.get_default_verify_paths().openssl_cafile)
# no content in this folder
os.listdir(openssl_dir)
# non existent file
print(os.path.exists(openssl_cafile))

Dies bedeutet, dass es für die Python Installation unter OSX keine Standardzertifizierungsstelle gibt. Ein möglicher Standard ist genau der, der im Paket certifi bereitgestellt wird.

Danach können Sie einfach einen SSL-Kontext erstellen, der die folgenden Standardeinstellungen hat (certifi.where() gibt den Speicherort einer Zertifizierungsstelle an):

import platform
# ...

ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
ssl_context.verify_mode = ssl.CERT_REQUIRED
ssl_context.check_hostname = True
ssl_context.load_default_certs()

if platform.system().lower() == 'darwin':
    import certifi
    ssl_context.load_verify_locations(
        cafile=os.path.relpath(certifi.where()),
        capath=None,
        cadata=None)

und fordere eine url von python wie folgt an:

import urllib
# previous context
https_handler = urllib.request.HTTPSHandler(context=ssl_context)

opener = urllib.request.build_opener(https_handler)
ret = opener.open(url, timeout=2)
4
Raffi

Ich hatte den Fehler mit Conda unter Linux. Meine Lösung war einfach.

conda install -c conda-forge certifi

Ich musste die Conda Forge verwenden, da das Standardzertifikat Probleme zu haben scheint.

0
netskink