Kendinden imzalı bir SSL sertifikasına güvenmek için Python istekleri nasıl alınır?


88
import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)

URL kendinden imzalı bir sertifika kullanıyorsa, bu başarısız olur

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Ben geçebilir biliyoruz Falseiçin verifybu gibi parametre:

r = requests.post(url, data=data, verify=False)

Ancak, yapmak istediğim şey, istekleri diskteki ortak anahtarın bir kopyasına yönlendirmek ve ona bu sertifikaya güvenmesini söylemek.


Yanıtlar:


61

Deneyin:

r = requests.post(url, data=data, verify='/path/to/public_key.pem')

1
Aynı şeyi yapıp aynı anda istemci sertifikalarını kullanabilir misiniz? Bununla ilgili sorunlar yaşıyorum.
user1156544

10
İlettiğiniz .pem dosyasının, sunucunun sertifikasını ve tüm ara sertifikaları içermesi gerektiğini unutmayın . Sunucunun sertifikasını ekledikten sonra neden çalışmadığını anlamaya çalışırken birkaç saatimi kaybettim.
ChrisBob

Kendinden imzalı sertifika.pem ekledim ve işe yaradı.
HS Rathore

6
Bu teknik benim için işe yaramadı. Eskiden ssl.get_server_certificateiçin bir sertifika indirirdim (self-signed.badssl.com, 443), o sertifikayı kaydettim cert.pemve sonra çalıştırdım requests.get('https://self-signed.badssl.com/', verify='cert.pem')ve hala bir SSL hatasıyla başarısız oldu (bu sertifika kendi kendine imzalanır).
Jason R. Coombs

41

verifyParametre ile özel bir sertifika yetkilisi paketi sağlayabilirsiniz

requests.get(url, verify=path_to_bundle_file)

Gönderen docs :

Sen geçebilir verifygüvenilen CA sertifikaları ile CA_BUNDLE dosyasının yolunu. Bu güvenilen CA'lar listesi REQUESTS_CA_BUNDLE ortam değişkeni aracılığıyla da belirtilebilir.


26

En kolayı, REQUESTS_CA_BUNDLEözel sertifika yetkilinize veya belirli bir sertifika paketine işaret eden değişkeni dışa aktarmaktır . Komut satırında bunu aşağıdaki gibi yapabilirsiniz:

export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

Eğer sertifika yetkisine sahip ve yazmak istemiyorsanız exportekleyebilir her zaman REQUESTS_CA_BUNDLEsenin için ~/.bash_profileaşağıdaki gibi:

echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile

Ortam değişkeni, PyCharm'ın OpenSSL sertifika dosyasında depolanan sertifikalarla çalışmasını sağlamak için ihtiyacım olan şeydi.
Brady

Zincirde kendinden imzalı bir sertifikam var. Bu çözüm boto3 kütüphanesi ile sorunumu çözdü.
Ilkin

7

Birden çok sertifikanın gerekli olduğu durum şu şekilde çözüldü: Birden çok kök pem dosyasını, myCert-A-Root.pem ve myCert-B-Root.pem'i bir dosyada birleştirin. Sonra REQUESTS_CA_BUNDLE var isteklerini ./.bash_profile dosyamdaki o dosyaya ayarlayın.

$ cp myCert-A-Root.pem ca_roots.pem
$ cat myCert-B-Root.pem >> ca_roots.pem
$ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile

O gün benim "ahhh" anımdı ... Çok teşekkürler ... Bu ipucuyla çalışmak için kendi imzalı jira sertifikamı aldım ... ;-) Bunu tanımlayan yüzlerce site ve yanıt olduğunu biliyorum , ama seninkini buldum, bu yüzden problemimi
çözmeme

4

Ayar export SSL_CERT_FILE=/path/file.crtişi yapmalı.


Teşekkürler. Benim için çalışıyor (Oysa REQUESTS_CA_BUNDLEbenim durumumda değişkenin bir etkisi yok).
Pascal H.

0

Httplib2 için bir CA (benim durumumda Charles Proxy) eklemek isteyen birinin buraya inmesi durumunda (benim yaptığım gibi) cacerts.txt, python paketinin içerdiği dosyaya ekleyebilirsiniz .

Örneğin:

cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

Diğer çözümlerde referans verilen ortam değişkenleri isteklere özgü görünüyor ve testimde httplib2 tarafından alınmadı.


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.