Wie füge ich dem von pip in Windows verwendeten CA Store ein benutzerdefiniertes CA-Stammzertifikat hinzu?

82

Ich habe gerade Python3 von python.org installiert und habe Probleme beim Installieren von Paketen mit pip. Standardmäßig gibt es hier im Netzwerk eine Man-in-the-Middle-Appliance für die Paketinspektion, die alle Pakete (einschließlich SSL) überprüft, indem alle SSL-Verbindungen mit einem eigenen Zertifikat gekündigt werden. Ein Teil des Gruppenrichtlinienobjekts überträgt das benutzerdefinierte Stammzertifikat in den Windows-Keystore.

Wenn ich bei Verwendung von Java auf externe https-Sites zugreifen muss, muss ich die Cacerts in der JVM manuell aktualisieren, um dem selbstsignierten CA-Zertifikat zu vertrauen.

Wie schaffe ich das für Python? Wenn ich gerade versuche, Pakete mit pipverständlicherweise zu installieren , erhalte ich wunderbare [SSL: CERTIFICATE_VERIFY_FAILED]Fehler.

Mir ist klar, dass ich sie mit dem --trusted-hostParameter ignorieren kann, aber ich möchte das nicht für jedes Paket tun, das ich installieren möchte.

Gibt es eine Möglichkeit, den von Python verwendeten CA-Zertifikatspeicher zu aktualisieren?

Eric B.
quelle
4
@rfkortekaas Bei all diesen Optionen wird dem Prozess etwas Neues hinzugefügt. Python muss einen Standard-Vertrauensspeicher verwenden, der irgendwo auf dem System gespeichert ist. Ich möchte diesen Trust Store ändern. Ich möchte keine zusätzlichen Variablen, verschiedene CA-Speicher usw. hinzufügen. In Java stützt sich der JVM auf einen eigenen Vertrauensspeicher (getrennt vom Betriebssystem). Ich vermute, dass Python etwas Ähnliches tun muss, da sich mein Stammzertifikat in meinem Windows Store befindet und von Python nicht erkannt wird.
Eric B.

Antworten:

94

Selbstsignierte Zertifizierungsstellen pip/conda

Nachdem wir ein ähnliches Problem mit Git ausführlich dokumentiert haben ( Wie kann ich Git dazu bringen, ein selbstsigniertes Zertifikat zu akzeptieren? ), Befinden wir uns wieder hinter einer Unternehmensfirewall mit einem Proxy, der uns einen MitM- "Angriff" gibt , dem wir vertrauen sollten, und:

Deaktivieren Sie NIEMALS alle SSL-Überprüfungen!

Dies schafft eine schlechte Sicherheitskultur. Sei nicht diese Person.

tl; dr

pip config set global.cert path/to/ca-bundle.crt
pip config list
conda config --set ssl_verify path/to/ca-bundle.crt
conda config --show ssl_verify

# Bonus while we are here...
git config --global http.sslVerify true
git config --global http.sslCAInfo path/to/ca-bundle.crt

Aber woher bekommen wir ca-bundle.crt?


Holen Sie sich ein aktuelles CA-Bundle

cURL veröffentlicht einen Auszug der mit Mozilla Firefox gebündelten Zertifizierungsstellen

https://curl.haxx.se/docs/caextract.html

Ich empfehle Ihnen, diese cacert.pemDatei in einem Texteditor zu öffnen, da wir dieser Datei unsere selbstsignierte Zertifizierungsstelle hinzufügen müssen.

Zertifikate sind ein Dokument, das X.509 entspricht. Sie können jedoch auf verschiedene Arten auf der Festplatte codiert werden. Der folgende Artikel ist eine gute Lektüre, aber die Kurzversion besagt, dass es sich um die Base64-Codierung handelt, die in den Dateierweiterungen häufig als PEM bezeichnet wird. Sie werden sehen, dass es das Format hat:

----BEGIN CERTIFICATE----
....
base64 encoded binary data
....
----END CERTIFICATE----

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them


Erhalten Sie unser selbstsigniertes Zertifikat

Im Folgenden finden Sie einige Optionen, wie Sie unser selbstsigniertes Zertifikat erhalten:

  • Über OpenSSL CLI
  • Über den Browser
  • Über Python Scripting

Holen Sie sich unser selbstsigniertes Zertifikat von OpenSSL CLI

/unix/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360

echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem

Holen Sie sich unsere selbstsignierte Zertifizierungsstelle über den Browser

Dank dieser Antwort und des verknüpften Blogs werden Schritte (unter Windows) zum Anzeigen des Zertifikats und zum Kopieren in eine Datei mithilfe der Base64-PEM-Codierungsoption angezeigt.

Kopieren Sie den Inhalt dieser exportierten Datei und fügen Sie ihn am Ende Ihrer cacerts.pemDatei ein.

Benennen Sie diese Datei aus Gründen der Konsistenz um cacerts.pem-> ca-bundle.crtund platzieren Sie sie an einem einfachen Ort wie:

# Windows
%USERPROFILE%\certs\ca-bundle.crt

# or *nix
$HOME/certs/cabundle.crt

Holen Sie sich unsere selbstsignierte Zertifizierungsstelle über Python

Vielen Dank an alle brillanten Antworten in:

Wie erhalte ich ein SSL-Antwortzertifikat von Anfragen in Python?

Ich habe Folgendes zusammengestellt, um zu versuchen, noch einen Schritt weiter zu gehen.

https://github.com/neozenith/get-ca-py


Schließlich

Stellen Sie die Konfiguration in pip und conda so ein, dass sie weiß, wo sich dieser CA-Speicher mit unserer zusätzlichen selbstsignierten CA befindet.

pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt

ODER

pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt

DANN

pip config list
conda config --show ssl_verify

# Hot tip: use -v to show where your pip config file is...
pip config list -v
# Example output for macOS and homebrew installed python
For variant 'global', will try loading '/Library/Application Support/pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.config/pip/pip.conf'
For variant 'site', will try loading '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/pip.conf'

Verweise

Josh Peak
quelle
5
Eine der größten Antworten aller Zeiten
Kevin Pauli
pip config set global.trusted-host XXXXX.com
zzzz zzzz
In Windows funktioniert es für mich mit dem PEM-Format für das Zertifikat.
Daniel Argüelles
1
@ DanielArgüelles ja das stimmt. Meistens kommt es vor, dass Sie das Certificate Authority-Bundle nicht zusammenführen, aber ich hatte genug Zeiten, in denen das gesamte Bundle benötigt wird, damit pip oder conda Zertifikate für andere Server validieren können. Letztendlich ist ein Bundle immer noch eine Textdatei mit dem Inhalt vieler PEM-Dateien. Ich bin froh, dass es funktioniert hat und Sie die Überprüfung nicht deaktivieren mussten! : D
Josh Peak
41

Ausführen: python -c "import ssl; print(ssl.get_default_verify_paths())"Zum Überprüfen der aktuellen Pfade, die zum Überprüfen des Zertifikats verwendet werden. Fügen Sie einem dieser Dokumente das Stammzertifikat Ihres Unternehmens hinzu.

Der Pfad openssl_capath_envzeigt auf die Umgebungsvariable : SSL_CERT_DIR.

Wenn SSL_CERT_DIRes nicht vorhanden ist, müssen Sie es erstellen und auf einen gültigen Ordner in Ihrem Dateisystem verweisen. Sie können dann Ihr Zertifikat zu diesem Ordner hinzufügen, um es zu verwenden.

rfkortekaas
quelle
10
Auf meinem Windows-System wird "/ usr / local / ssl / certs" zurückgegeben, was unter Windows nicht verfügbar ist.
Colin Talbert
1
Nachdem ich an einem anderen Projekt beteiligt war, konnte ich dies endlich auch tun, und ähnlich wie bei @ColinTalbert verweist es auf einen nicht vorhandenen Ordner /usr/local/ssl/certs.
Eric B.
Ich habe meine Frage bearbeitet und hoffe, dass dies den Fall löst.
rfkortekaas
1
@rfkortekaas Das Aktualisieren der Variablen SSL_CERT_FILE oder SSL_CERT_DIR hat nicht funktioniert. Ich habe gerade eine neue SO-Frage für dieses Problem erstellt, da es sich möglicherweise nicht nur um die Aktualisierung einer PEM-Datei handelt, sondern vielmehr darum, wie Python in Cygwin / Windows auf die richtigen Pfade zugreifen kann.
Eric B.
1
Ich habe es versucht. Am Ende habe ich eine pip.conf-Datei ~/.config/pip/pip.confmit den erforderlichen Einstellungen erstellt. Siehe diese Antwort .
Eric B.
7

Nicht die beste Antwort, aber Sie können ein bereits erstelltes Ca-Bundle mit der folgenden --certOption wiederverwenden pip:

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
Aturegano
quelle
4

Unter Windows habe ich es gelöst, indem ich eine pip.ini-Datei in% APPDATA% \ pip \ erstellt habe

zB C: \ Users \ asmith \ AppData \ Roaming \ pip \ pip.ini

In der pip.ini habe ich den Pfad zu meinem Zertifikat angegeben:

[global]
cert=C:\Users\asmith\SSL\teco-ca.crt

Unter https://pip.pypa.io/en/stable/user_guide/#configuration finden Sie weitere Informationen zur Konfigurationsdatei.

Alex
quelle
Hallo Alex, wie hast du den Pfad zu deinem Zertifikat in die Datei pip.ini "eingefügt"? Von der Kommandozeile? Haben Sie den Dateipfad in einen Editor eingegeben und als Textdatei gespeichert? Ich verwende die Anaconda-Eingabeaufforderung, aber ich denke, sie ähnelt Windows.
Spacedustpi
Ich habe mit Notepad eine Textdatei erstellt und dann die Dateierweiterung von "txt" in "ini" geändert.
Alex
Ah. In Ordnung. Müssen Sie auch "[gobal]" über dem Pfad eingeben? Wissen Sie, wo ich ein Tutorial für diese Art von Dingen machen kann? Vielen Dank.
Spacedustpi
Ja, Sie müssen auch "[global]" eingeben. Entschuldigung, ich kenne kein Tutorial, aber pip.pypa.io/en/stable/user_guide/#configuration enthält weitere Informationen.
Alex
Danke, ich habe es in beide Richtungen ausprobiert und ja, "[global]" tut nicht weh.
Spacedustpi
1

Eine alternative Lösung unter Windows ist die Installation von python-certifi-win32, mit der Python den Windows-Zertifikatspeicher verwenden kann.

pip install python-certifi-win32
nt86
quelle
-1

Öffnen Sie Anaconda Navigator.

Gehen Sie zu Datei \ Einstellungen.

SSL-Überprüfung aktivieren Deaktivieren (nicht empfohlen)

oder SSL-Zertifikatpfad aktivieren und angeben (optional)

Aktualisieren Sie ein Paket auf eine bestimmte Version:

Wählen Sie oben rechts installieren

Paket auswählen auf Häkchen klicken

Zum Aktualisieren markieren

Markieren Sie für die Installation einer bestimmten Version

Klicken Sie auf Übernehmen

itsergiu
quelle