Все это объясняется в разделе Проверка сертификата SSL документа requests
.
По умолчанию requests
использует сертификаты certifi
если присутствует, то возврат к тому, что urllib3
думает, является хранилищем сертификатов вашей ОС, которое само по себе возвращается к тому, о чем думает Python (хотя в старых версиях это часто не было).
Ваша компания, очевидно, имеетчастный, возможно, даже самоподписанный сертификат, который не будет в certifi
. может находиться в хранилище сертификатов Windows - в этом случае urllib3
должно автоматически его забрать, но я подозреваю, что это не так.Возможно, сертификат устанавливается непосредственно в какую-то пользовательскую настройку браузера, которую ваш ИТ-отдел заставляет использовать, а не в магазин ОС.Или, может быть, он не установлен вообще.(Вы не упоминали о возможности доступа к этому сайту в браузере, не увидев значок сломанного замка…)
Вы передаете --no check certificate
(или, более вероятно, --no-check-certificate
?) На wget
, поэтому вы просто не проверяете SSL.И если вы хотите сделать то же самое в requests
, это просто:
requests.get(url, verify=False)
Если вы уверены, что у вас установлен сертификат, даже если wget
может 'не могу найти его ... ну, ваш код не будет работать так, как написано.Вот что будет работать:
- Игнорируйте сертификат и просто отключите проверку, как показано выше.
- Определите, где на самом деле установлен соответствующий сертификат и как его загрузить, и:
- Передавайте его в качестве аргумента
verify
при каждом requests
вызове. - Установите его где-нибудь статически и передайте в переменной окружения.
- Установите его по умолчаниюхранилище сертификатов, чтобы все работало автоматически.
- Напишите
HTTPAdapter
, который установит его в ваш requests
сеанс.
Сначала ваш кодпросто пытается получить сертификат по умолчанию точно так же, как это делает Python.Этот модуль wincertstore
является всего лишь бэкпортом того, что уже встроено в Python 3.4+.
Во-вторых, весь ваш код делает получение сертификата, используя его для создания сокета SSL,игнорируя этот сокет, и приказывая requests
делать все как обычно.Это ничего не поможет.Если вы хотите передать сертификат на requests
, вы должны сделать это:
requests.get(url, verify='/path/to/cert')
… или поместить его в переменную окружения REQUESTS_CA_BUNDLE
… или сделать HTTPAdapter
код, который я показал вам в чате (и который вы нашли в старой, нерабочей версии, где-то не указано).См. HTTPAdapter
в документации, если вы действительно хотите это сделать.