Windows'ta pip tarafından kullanılan CA Mağazasına özel bir CA Kök sertifikası nasıl eklenir?


85

Python3'ü python.org'dan yeni yükledim ve ile paketleri kurmakta sorun yaşıyorum pip. Tasarım gereği, buradaki ağda, tüm SSL bağlantılarını kendi sertifikasıyla yeniden imzalayarak tüm paketleri (SSL dahil) inceleyen bir ortadaki adam paket inceleme aracı vardır. GPO'nun bir kısmı, özel kök sertifikayı Windows Anahtar Deposu'na gönderir.

Java kullanırken, herhangi bir harici https sitesine erişmem gerekirse, Kendinden İmzalı CA sertifikasına güvenmek için JVM'deki cacerts'ı manuel olarak güncellemem gerekir.

Bunu python için nasıl başarabilirim? Şu anda, paketleri kullanarak kurmaya çalıştığımda pipanlaşılır bir şekilde harika [SSL: CERTIFICATE_VERIFY_FAILED]hatalar alıyorum .

--trusted-hostParametreyi kullanarak onları görmezden gelebileceğimin farkındayım , ancak kurmaya çalıştığım her paket için bunu yapmak istemiyorum.

Python'un kullandığı CA Sertifika deposunu güncellemenin bir yolu var mı?


5
@rfkortekaas Tüm bu seçeneklerin tümü sürece yeni bir şeyler eklemeyi içerir. Python, sistemde bir yerde depolanan varsayılan bir güven deposunu kullanmalıdır. Bu güven deposunu değiştirmek istiyorum. Fazladan değişkenler, farklı ca depoları vb. Eklemek istemiyorum. Java'da jvm kendi güven deposuna (işletim sisteminden ayrı) dayanır. Kök sertifikam Windows mağazamda olduğu ve python tarafından tanınmadığı için python'un benzer bir şey yaptığından şüpheleniyorum.
Eric B.

Yanıtlar:


98

Kendinden İmzalı Sertifika Yetkilileri pip/conda

Git ile benzer bir sorunu kapsamlı bir şekilde belgeledikten sonra ( git'e kendi kendine imzalanan bir sertifikayı nasıl kabul ettirebilirim? ), Burada yine kurumsal bir güvenlik duvarının arkasındayız ve bir proxy ile bize güvenmemiz gereken bir MitM "saldırısı" yapıyoruz ve:

Tüm SSL doğrulamasını ASLA devre dışı bırakmayın!

Bu kötü bir güvenlik kültürü yaratır. O kişi olmayın.

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

Ama nereden alıyoruz ca-bundle.crt?


Güncel bir CA Paketi edinin

cURL, Mozilla Firefox ile birlikte verilen Sertifika Yetkililerinin bir özetini yayınlar

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

cacert.pemKendinden imzalı CA'mızı bu dosyaya eklememiz gerekeceğinden, bu dosyayı bir metin düzenleyicide açmanızı tavsiye ederim .

Sertifikalar, X.509 ile uyumlu bir belgedir ancak diske birkaç şekilde kodlanabilirler. Aşağıdaki makale iyi bir okuma ama kısa versiyon, dosya uzantılarında genellikle PEM olarak adlandırılan base64 kodlamasıyla uğraştığımızdır. Şu biçime sahip olduğunu göreceksiniz:

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


Kendinden İmzalı Sertifikamızı Alma

Aşağıda, kendinden imzalı sertifikamızı nasıl alacağınıza dair birkaç seçenek bulunmaktadır:

  • OpenSSL CLI aracılığıyla
  • Tarayıcı aracılığıyla
  • Python Scripting ile

OpenSSL CLI ile Kendinden İmzalı Sertifikamızı alın

/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

Kendinden İmzalı Sertifika Yetkilimizi Tarayıcı aracılığıyla edinin

Bu cevap ve bağlantılı blog sayesinde, sertifikanın nasıl görüntüleneceği ve ardından base64 PEM kodlama seçeneğini kullanarak dosyaya nasıl kopyalanacağı (Windows'ta) adımları gösterir.

Dışa aktarılan bu dosyanın içeriğini kopyalayın ve dosyanızın sonuna yapıştırın cacerts.pem.

Tutarlılık için bu dosyayı cacerts.pem-> yeniden adlandırın ca-bundle.crtve aşağıdaki gibi kolay bir yere yerleştirin:

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

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

Kendinden İmzalı Sertifika Yetkilimizi Python aracılığıyla edinin

Tüm parlak cevaplar için teşekkürler:

Python'daki isteklerden yanıt SSL sertifikası nasıl alınır?

Bunu bir adım daha ileri götürmek için aşağıdakileri bir araya getirdim.

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


En sonunda

Yapılandırmayı pip ve conda olarak ayarlayın, böylece bu CA mağazasının ekstra kendinden imzalı CA'mızla nerede olduğunu bilebilir.

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

VEYA

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

SONRA

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'

Referanslar


6
Tüm zamanların en büyük cevaplarından biri
Kevin Pauli

pip config set global.trusted-host XXXXX.com
zzzz zzzz

Windows'ta, sertifika için .pem biçimini kullanarak benim için çalışıyor.
Daniel Argüelles

1
@ DanielArgüelles evet bu doğru. Çoğu zaman Sertifika Yetkilisi paketini birleştirmemekle kurtulabilirsiniz, ancak pip veya conda'nın diğer sunucular için sertifikaları doğrulayabilmesi için tam paketin gerekli olduğu yeterince zamanım oldu. Sonuçta bir paket, birçok pem dosyasının içeriğine sahip bir metin dosyasıdır. İşe yaradığına ve doğrulamayı devre dışı bırakmanıza gerek olmadığına sevindim! : D
Josh Peak

42

Çalıştır: python -c "import ssl; print(ssl.get_default_verify_paths())"sertifikayı doğrulamak için kullanılan mevcut yolları kontrol etmek için. Şirketinizin kök sertifikasını bunlardan birine ekleyin.

Yol openssl_capath_envortam değişkeni işaret: SSL_CERT_DIR.

Eğer SSL_CERT_DIRyoksa, onu oluşturmanız ve dosya sisteminiz içinde geçerli bir klasöre işaret etmeniz gerekecektir. Daha sonra kullanmak için sertifikanızı bu klasöre ekleyebilirsiniz.


11
Windows sistemimde bu, Windows'ta bulunmayan '/ usr / local / ssl / certs' döndürür.
Colin Talbert

1
Sonunda başka bir projeye çekildikten sonra bunu yapmaya başladım ve @ColinTalbert'e benzer şekilde var olmayan bir klasöre işaret ediyor /usr/local/ssl/certs.
Eric B.

Sorumu düzenledim ve umarım bu davayı çözer.
rfkortekaas

1
@rfkortekaas SSL_CERT_FILE veya SSL_CERT_DIR değişkenlerinin güncellenmesi işe yaramadı. Bu sorun için yeni bir SO sorusu oluşturdum , çünkü bu sadece bir PEM dosyasının nasıl güncelleneceği değil, daha ziyade cygwin / Windows'ta doğru yollara erişmek için python'un nasıl elde edileceği ile ilgili bir soru olabilir.
Eric B.

1
Denedim. ~/.config/pip/pip.confGerekli ayarlarla bir pip.conf dosyası oluşturdum . Bu cevaba bakın .
Eric B.

7

En iyi cevap değil, ancak önceden oluşturulmuş bir ca paketini şu --certseçeneği kullanarak yeniden kullanabilirsiniz pip, örneğin:

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

4

Windows'ta,% APPDATA% \ pip \ dizininde bir pip.ini dosyası oluşturarak çözdüm

örneğin C: \ Users \ asmith \ AppData \ Roaming \ pip \ pip.ini

Pip.ini'de sertifikamın yolunu koyuyorum:

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

https://pip.pypa.io/en/stable/user_guide/#configuration , yapılandırma dosyası hakkında daha fazla bilgi içerir.


Merhaba Alex, sertifikanızın yolunu pip.ini dosyasına nasıl "koydunuz"? Komut satırından mı? Dosya yolunu not defteri gibi bir şeye yazıp metin dosyası olarak kaydettiniz mi? Anaconda komut istemini kullanıyorum, ancak pencerelere benzer olduğunu düşünüyorum.
spacedustpi

Not Defteri ile bir metin dosyası oluşturdum ve ardından "txt" olan dosya uzantısını "ini" olarak değiştirdim.
Alex

Ah. Tamam. Yolun üstüne de "[gobal]" yazmanız gerekiyor mu? Bu tür şeyler için bir eğitim için nereye gidebileceğimi biliyor musunuz? Teşekkürler.
spacedustpi

Evet, "[global]" yazmanız da gerekiyor. Maalesef herhangi bir eğitim bilmiyorum ama pip.pypa.io/en/stable/user_guide/#configuration daha fazla bilgi içeriyor .
Alex

Teşekkürler, her iki şekilde de denedim ve evet, "[global]" canımı yakmadı.
spacedustpi

1

Windows'ta alternatif çözüm, Python'un Windows Sertifika Mağazası'nı kullanmasına izin verecek python-certifi-win32'yi yüklemektir.

pip install python-certifi-win32

0

Nt86'nın çözümünün en uygun çözüm olduğunu düşünüyorum çünkü temeldeki Windows altyapısını (sertifika deposu) kullanıyor. Ancak pip işlevsel olmadığından başlamak için python-certifi-win32'nin nasıl kurulacağını açıklamıyor.

İşin püf noktası --trustedhostpython-certifi-win32'yi kullanmaktır ve bundan sonra pip, proxy tarafından kullanılan sertifikayı yüklemek için otomatik olarak Windows sertifika deposunu kullanacaktır.

Yani kısaca şunu yapmalısınız:

pip install python-certifi-win32 -trustedhost pypi.org

ve ondan sonra gitmek için iyi olmalısın


-1

Anaconda Navigator'ı açın.

Dosya \ Tercihler'e gidin.

SSL doğrulamasını etkinleştir Devre Dışı Bırak (önerilmez)

veya SSL sertifika yolunu etkinleştirin ve belirtin (İsteğe bağlı)

Bir paketi belirli bir sürüme güncelleyin:

Sağ Üstte Yükle'yi seçin

Paket seçin onay işaretine tıklayın

Güncelleme için işaretle

Belirli sürüm kurulumu için işaretleyin

Uygula'yı tıklayın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.