Как я могу получить «/path/to/certfile» общедоступного веб-сайта для запросов?

Я использую запросы для получения HTML веб-страницы. Однако у меня возникают проблемы с проверкой сертификата. При запуске кода я получаю следующую ошибку:

SSL: CERTIFICATE_VERIFY_FAILED

Просматривая другие вопросы, я нашел два решения. Тот, который работает, — это отключить проверку через verify=False в вызове функции. Однако это не безопасный вариант.

Другой - использовать verify='/path/to/certfile'

Я не уверен, как получить путь к certfile. Через настройки в браузере Chromer я попал в приложение «доступ к связке ключей» на Mac с различными сертификатами. Я экспортировал сертификат «DST Root CA X3» в свой рабочий каталог и указал путь к этому файлу в качестве значения '/path/to/certfile'. Но это дает мне следующую ошибку:

requests.exceptions.SSLError: HTTPSConnectionPool(host='rajyasabha.nic.in', port=443): Max retries exceeded with url: /rsnew/member_site/MemlistElDate.aspx (Caused by SSLError(SSLError(0, 'unknown error (_ssl.c:3622)'),))

питон:

import requests
url='https://rajyasabha.nic.in/rsnew/member_site/MemlistElDate.aspx'
page=requests.get(url)

Есть ли другой способ получить путь к certfile?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
786
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с этим сайтом заключается в том, что сервер неправильно настроен для возврата промежуточного сертификата в цепочке сертификатов во время рукопожатия TLS. Вы можете проверить это с помощью следующей команды:

openssl s_client -connect rajyasabha.nic.in:443

Если вы прокрутите вниз, вы увидите, что сервер отправляет только глубину 0 (конечный сертификат). Как правило, это не проблема для веб-браузеров, поскольку они кэшируют промежуточные сертификаты, но это проблема для requests, поскольку он не знает об этом.

Корневые сертификаты (в данном случае DST Root CA X3) почти всегда существуют в репозитории ЦС вашей операционной системы. Итак, нам нужен сертификат:

depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

Поэтому лучше всего загрузить промежуточный сертификат Let's Encrypt Authority X3 по следующему URL-адресу и установить его в качестве пути verify:

https://letsencrypt.org/сертификаты/

Уточнение: вы должны включить как промежуточные, так и корневые сертификаты в свой файл .pem, поэтому он должен выглядеть так:

-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIRANOxciY0IzLc9AUoUSrsnGowDQYJKoZIhvcNAQELBQAw
...
rUCGwbCUDI0mxadJ3Bz4WxR6fyNpBK2yAinWEsikxqEt
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
...
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----

Я пробовал: page=requests.get(url, verify='/Users/Path/lets-encrypt-x3-cross-signed.pem'), но возвращает ту же ошибку: [SSL: CERTIFICATE_VERIFY_FAILED] проверка сертификата не удалась (_ssl .с:833)

Sam 31.05.2019 07:27

Не уверен, что с этим не так, но попробуйте вторую ссылку (подписанную корнем ISRG) и не забудьте добавить корневой (DST) сертификат в конец файла, потому что при использовании verify= он не будет запрашивать вашу операционную систему. для корневого сертификата больше. Вы должны поставить оба вручную.

Selcuk 31.05.2019 07:52

Большое спасибо. Теперь он работает отлично. Итак, я предполагаю, что это решение в будущем, когда я сталкиваюсь с такой проблемой.

Sam 31.05.2019 19:53

Я рад, что это помогло. Это не должно происходить очень часто, поскольку обычно веб-серверы настроены на предоставление промежуточного сертификата вместе с конечным сертификатом.

Selcuk 02.06.2019 14:25

Если я могу задать другой связанный вопрос. Это произошло снова, и на этот раз два сертификата — DigiCert High Assurance EV Root CA и GeoTrust EV RSA CA 2018. Оба находятся в этом страница. Я попытался сделать то же самое, что и в прошлый раз, но когда я открываю сертификат в текстовом редакторе, я получаю искаженный текст. Есть ли способ добавить промежуточный сертификат к корневому сертификату?

Sam 03.06.2019 23:31

Если они выглядят как мусор, они, вероятно, в двоичном формате (DER, PKCS#12). Используйте командную строку openssl или онлайн-конвертер, например Вот этот, чтобы преобразовать его в формат PEM.

Selcuk 04.06.2019 01:44

Еще раз это сработало как шарм. Я новичок во всем этом, и я очень ценю вашу помощь.

Sam 04.06.2019 03:47

Другие вопросы по теме