Як отримати запити Python для довіри до власного підписаного сертифіката SSL?


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

Якщо URL використовує самопідписаний сертифікат, це не вдається виконати

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

Я знаю, що можу перейти Falseдо verifyпараметра, наприклад:

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

Однак, що я хотів би зробити, це спрямувати запити на копію відкритого ключа на диску та сказати йому довіряти цьому сертифікату.


Відповіді:


61

спробуйте:

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

1
Чи можете ви зробити те саме і одночасно використовувати сертифікати клієнта? У мене виникають проблеми з цим.
user1156544

10
Зверніть увагу, що переданий вами файл .pem повинен містити сертифікат сервера та будь-які проміжні сертифікати . Я втратив кілька годин, намагаючись зрозуміти, чому це не спрацювало після додавання сертифіката сервера.
ChrisBob

Я додав самопідписаний сертифікат.pem, і він спрацював.
HS

6
Ця техніка у мене не спрацювала. Раніше я ssl.get_server_certificateзавантажував сертифікат (self-signed.badssl.com, 443), зберігав цей сертифікат cert.pem, а потім запускав, requests.get('https://self-signed.badssl.com/', verify='cert.pem')і він все одно не вдався з помилкою SSL (цей сертифікат має власний підпис).
Джейсон Р. Кумбс,

41

За допомогою verifyпараметра ви можете надати спеціальний комплект центру сертифікації

requests.get(url, verify=path_to_bundle_file)

З документів :

Ви можете передати verifyшлях до файлу CA_BUNDLE із сертифікатами надійних центрів сертифікації. Цей список надійних центрів сертифікації також можна вказати через змінну середовища REQUESTS_CA_BUNDLE.


26

Найпростіше експортувати змінну, REQUESTS_CA_BUNDLEяка вказує на ваш приватний центр сертифікації, або на певний пакет сертифікатів. У командному рядку ви можете зробити це наступним чином:

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

Якщо у вас є центр сертифікації, і ви не хочете вводити exportкожен раз, ви можете додати його REQUESTS_CA_BUNDLEдо свого ~/.bash_profileнаступним чином:

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

Змінна середовища була тим, що мені потрібно, щоб PyCharm працював із сертифікатами, що зберігаються у файлі сертифіката OpenSSL.
Брейді

У мене в мережі є самопідписаний сертифікат. Це рішення вирішило мою проблему з бібліотекою boto3.
Ілкін

7

Випадок, коли потрібні кілька сертифікатів, був вирішений наступним чином: об’єднати у файл кілька кореневих файлів pem, myCert-A-Root.pem та myCert-B-Root.pem. Потім встановіть запити REQUESTS_CA_BUNDLE до цього файлу в моєму ./.bash_profile.

$ 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

Це був мій "ах-а-а" момент доби ... Велике спасибі ... За допомогою цього підказки я отримав власний підписаний сертифікат jira для роботи ... ;-) Я знаю, що, можливо, є безліч сайтів і відповідей, які описують це , але я знайшов вашу, тож ви отримуєте мою честь за допомогу у вирішенні моєї проблеми ... d
alexrjs

4

Налаштування export SSL_CERT_FILE=/path/file.crtмає зробити роботу.


Дякую. Працює для мене (тоді як REQUESTS_CA_BUNDLEзмінна не впливає в моєму випадку).
Паскаль Х.

0

Якщо хтось випадково приземлиться тут (як я), бажаючи додати CA (у моєму випадку Charles Proxy) для httplib2, схоже, ви можете додати його до cacerts.txtфайлу, що входить до пакета python.

Наприклад:

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

Змінні середовища, на які посилаються інші рішення, здається, специфічні для запитів і не були підібрані httplib2 під час мого тестування.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.