Właśnie zainstalowałem Python3 z python.org i mam problem z instalacją pakietów z pip
. Zgodnie z projektem w sieci znajduje się urządzenie do inspekcji pakietów typu man-in-the-middle, które sprawdza wszystkie pakiety (w tym SSL), rezygnując z wszystkich połączeń SSL z własnym certyfikatem. Część obiektu zasad grupy wypycha niestandardowy certyfikat główny do magazynu kluczy systemu Windows.
Jeśli używam języka Java, muszę uzyskać dostęp do zewnętrznych witryn https, muszę ręcznie zaktualizować cacerts w JVM, aby ufać certyfikatowi Self-Signed CA.
Jak to zrobić w Pythonie? W tej chwili, gdy próbuję zainstalować pakiety przy użyciu pip
, co zrozumiałe, otrzymuję wspaniałe [SSL: CERTIFICATE_VERIFY_FAILED]
błędy.
Zdaję sobie sprawę, że mogę je zignorować, używając --trusted-host
parametru, ale nie chcę tego robić dla każdego pakietu, który próbuję zainstalować.
Czy istnieje sposób na zaktualizowanie magazynu certyfikatów urzędu certyfikacji, z którego korzysta Python?
Odpowiedzi:
Urzędy certyfikacji z podpisem własnym
pip
/conda
Po dokładnym udokumentowaniu podobnego problemu z Gitem ( Jak sprawić, by git zaakceptował certyfikat z podpisem własnym? ), Znowu jesteśmy za korporacyjną zaporą ogniową z serwerem proxy, który daje nam „atak” MitM , któremu powinniśmy zaufać i:
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
Ale dokąd to dotrzemy
ca-bundle.crt
?Uzyskaj aktualny pakiet CA
cURL publikuje wyciąg z urzędów certyfikacji dołączony do przeglądarki Mozilla Firefox
https://curl.haxx.se/docs/caextract.html
Zalecam otwarcie tego
cacert.pem
pliku w edytorze tekstu, ponieważ będziemy musieli dodać nasz samopodpisany CA do tego pliku.Certyfikaty to dokument zgodny ze standardem X.509, ale można je zakodować na dysk na kilka sposobów. Poniższy artykuł jest dobrą lekturą, ale w krótkiej wersji mamy do czynienia z kodowaniem base64, które często jest nazywane PEM w rozszerzeniach plików. Zobaczysz, że ma format:
https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them
Uzyskanie naszego certyfikatu z podpisem własnym
Poniżej znajduje się kilka opcji, jak uzyskać nasz certyfikat z podpisem własnym:
Uzyskaj nasz certyfikat z podpisem własnym przez 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
Uzyskaj nasz urząd certyfikacji z podpisem własnym za pośrednictwem przeglądarki
Dzięki tej odpowiedzi i powiązanemu blogowi pokazuje kroki (w systemie Windows), jak wyświetlić certyfikat, a następnie skopiować do pliku przy użyciu opcji kodowania base64 PEM.
Skopiuj zawartość tego wyeksportowanego pliku i wklej go na końcu
cacerts.pem
pliku.Dla spójności zmień nazwę tego pliku
cacerts.pem
->ca-bundle.crt
i umieść go w łatwym miejscu, na przykład:# Windows %USERPROFILE%\certs\ca-bundle.crt # or *nix $HOME/certs/cabundle.crt
Uzyskaj nasz urząd certyfikacji z podpisem własnym za pośrednictwem języka Python
Dzięki wszystkim genialnym odpowiedziom w:
Jak uzyskać certyfikat SSL odpowiedzi z żądań w Pythonie?
Złożyłem poniższe, aby spróbować pójść o krok dalej.
https://github.com/neozenith/get-ca-py
Wreszcie
Ustaw konfigurację w pip i conda, aby wiedziała, gdzie znajduje się ten magazyn urzędu certyfikacji z naszym dodatkowym urzędem certyfikacji z podpisem własnym.
pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt
LUB
pip config set global.cert $HOME/certs/ca-bundle.crt conda config --set ssl_verify $HOME/certs/ca-bundle.crt
NASTĘPNIE
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'
Bibliografia
źródło
Biegać:
python -c "import ssl; print(ssl.get_default_verify_paths())"
aby sprawdzić bieżące ścieżki, które są używane do weryfikacji certyfikatu. Dodaj certyfikat główny swojej firmy do jednego z nich.Ścieżka
openssl_capath_env
wskazuje na zmienną środowiskową:SSL_CERT_DIR
.Jeśli
SSL_CERT_DIR
nie istnieje, musisz go utworzyć i wskazać prawidłowy folder w systemie plików. Następnie możesz dodać swój certyfikat do tego folderu, aby go używać.źródło
/usr/local/ssl/certs
.~/.config/pip/pip.conf
z niezbędnymi ustawieniami. Zobacz tę odpowiedź .Nie najlepsza odpowiedź, ale możesz ponownie wykorzystać już utworzony pakiet ca, korzystając z
--cert
opcjipip
, na przykład:pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
źródło
W systemie Windows rozwiązałem to, tworząc plik pip.ini w% APPDATA% \ pip \
np. C: \ Users \ asmith \ AppData \ Roaming \ pip \ pip.ini
W pip.ini umieściłem ścieżkę do mojego certyfikatu:
[global] cert=C:\Users\asmith\SSL\teco-ca.crt
https://pip.pypa.io/en/stable/user_guide/#configuration zawiera więcej informacji o pliku konfiguracyjnym.
źródło
Alternatywnym rozwiązaniem w systemie Windows jest zainstalowanie python-certifi-win32, które umożliwi Pythonowi korzystanie z magazynu certyfikatów systemu Windows.
źródło
Myślę, że rozwiązanie NT86 jest najbardziej odpowiednie, ponieważ wykorzystuje podstawową infrastrukturę systemu Windows (magazyn certyfikatów). Ale nie wyjaśnia, jak zainstalować python-certifi-win32 na początek, ponieważ pip nie działa.
Sztuczka polega na tym,
--trustedhost
aby zainstalować python-certifi-win32, a następnie pip automatycznie użyje magazynu certyfikatów systemu Windows do załadowania certyfikatu używanego przez proxy.Krótko mówiąc, powinieneś zrobić:
a potem powinieneś być gotowy
źródło
Otwórz Anaconda Navigator.
Przejdź do Plik \ Preferencje.
Włącz weryfikację SSL Wyłącz (niezalecane)
lub Włącz i wskaż ścieżkę certyfikatu SSL (opcjonalnie)
Zaktualizuj pakiet do określonej wersji:
Wybierz opcję Zainstaluj w prawym górnym rogu
Wybierz pakiet kliknij haczyk
Zaznacz do aktualizacji
Zaznacz do instalacji określonej wersji
Kliknij Zastosuj
źródło