it-swarm.com.de

Wie füge ich dem CA Store, der von pip in Windows verwendet wird, ein benutzerdefiniertes CA Root-Zertifikat hinzu?

Ich habe gerade Python3 von python.org installiert und habe Probleme, Pakete mit pip zu installieren. In diesem Netzwerk befindet sich eine Man-in-the-Middle-Paketprüfungs-Appliance, die alle Pakete (einschließlich SSL) prüft, indem sie alle SSL-Verbindungen mit ihrem eigenen Zertifikat aufgibt. Ein Teil des GPO verschiebt das benutzerdefinierte Stammzertifikat in den Windows-Keystore.

Wenn ich mit Java auf externe https-Sites zugreifen möchte, muss ich die cacerts in der JVM manuell aktualisieren, um dem selbstsignierten CA-Zertifikat zu vertrauen.

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

Mir ist klar, dass ich sie mit dem Parameter --trusted-Host Ignorieren kann, aber ich möchte das nicht für jedes Paket tun, das ich zu installieren versuche.

Gibt es eine Möglichkeit, den CA-Zertifikatspeicher zu aktualisieren, der python verwendet?

47
Eric B.

Selbstsignierte Zertifizierungsstellen pip/conda

Nachdem wir ein ähnliches Problem mit Git ausführlich dokumentiert haben ( Wie kann ich git dazu bringen, ein selbstsigniertes Zertifikat anzunehmen? ), befinden wir uns hier wieder hinter einer Unternehmens-Firewall mit einem Proxy, der uns einen MitM "-Angriff ermöglicht " dass wir vertrauen sollten und:

Deaktivieren Sie NIEMALS die gesamte SSL-Überprüfung!

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.pem - Datei in einem Texteditor zu öffnen, da wir dieser Datei unsere selbstsignierte Zertifizierungsstelle hinzufügen müssen.

Zertifikate sind ein Dokument, das mit X.509 übereinstimmt, können jedoch auf verschiedene Arten auf der Festplatte verschlüsselt werden. Der folgende Artikel ist gut gelesen, aber in der Kurzversion handelt es sich um die Base64-Codierung, die in den Dateierweiterungen häufig als PEM bezeichnet wird. Sie werden sehen, es hat das Format:

----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

Nachfolgend finden Sie einige Möglichkeiten, wie Sie unser selbstsigniertes Zertifikat erhalten können:

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

Holen Sie sich unser selbstsigniertes Zertifikat von OpenSSL CLI

https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#46836

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

Erhalten Sie 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 unter Verwendung der Base64-PEM-Codierungsoption gezeigt.

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

Benennen Sie diese Datei aus Konsistenzgründen cacerts.pem -> ca-bundle.crt Um und platzieren Sie sie an einem einfachen Ort wie:

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

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

Erhalten Sie unsere selbstsignierte Zertifizierungsstelle über Python

Vielen Dank für die tollen Antworten in:

Wie erhalte ich ein Antwort-SSL-Zertifikat von Anfragen in Python?

Ich habe das Folgende zusammengestellt, um einen Schritt weiter zu gehen.

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


Endlich

Stellen Sie die Konfiguration in pip und conda so ein, dass bekannt ist, wo sich dieser CA-Speicher bei 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

OR

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

Verweise

43
Josh Peak

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

Der Weg openssl_capath_env zeigt auf die Umgebungsvariable: SSL_CERT_DIR.

Ob SSL_CERT_DIR existiert nicht, Sie müssen es erstellen und auf einen gültigen Ordner in Ihrem Dateisystem verweisen. Anschließend können Sie Ihr Zertifikat zu diesem Ordner hinzufügen, um es zu verwenden.

32
rfkortekaas

Nicht die beste Antwort, aber Sie können ein bereits erstelltes Ca-Bundle mit der Option --cert Von pip wiederverwenden. Beispiel:

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
7
aturegano

Unter Windows löste ich das Problem, indem ich eine pip.ini-Datei in% APPDATA%\pip\erstellte.

z.B. C:\Users\asmith\AppData\Roaming\pip\pip.ini

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

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

https://pip.pypa.io/en/stable/user_guide/#configuration enthält weitere Informationen zur Konfigurationsdatei.

3
Alex