Я использую запросы для получения 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?






Проблема с этим сайтом заключается в том, что сервер неправильно настроен для возврата промежуточного сертификата в цепочке сертификатов во время рукопожатия 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-----
Не уверен, что с этим не так, но попробуйте вторую ссылку (подписанную корнем ISRG) и не забудьте добавить корневой (DST) сертификат в конец файла, потому что при использовании verify= он не будет запрашивать вашу операционную систему. для корневого сертификата больше. Вы должны поставить оба вручную.
Большое спасибо. Теперь он работает отлично. Итак, я предполагаю, что это решение в будущем, когда я сталкиваюсь с такой проблемой.
Я рад, что это помогло. Это не должно происходить очень часто, поскольку обычно веб-серверы настроены на предоставление промежуточного сертификата вместе с конечным сертификатом.
Если я могу задать другой связанный вопрос. Это произошло снова, и на этот раз два сертификата — DigiCert High Assurance EV Root CA и GeoTrust EV RSA CA 2018. Оба находятся в этом страница. Я попытался сделать то же самое, что и в прошлый раз, но когда я открываю сертификат в текстовом редакторе, я получаю искаженный текст. Есть ли способ добавить промежуточный сертификат к корневому сертификату?
Если они выглядят как мусор, они, вероятно, в двоичном формате (DER, PKCS#12). Используйте командную строку openssl или онлайн-конвертер, например Вот этот, чтобы преобразовать его в формат PEM.
Еще раз это сработало как шарм. Я новичок во всем этом, и я очень ценю вашу помощь.
Я пробовал: page=requests.get(url, verify='/Users/Path/lets-encrypt-x3-cross-signed.pem'), но возвращает ту же ошибку: [SSL: CERTIFICATE_VERIFY_FAILED] проверка сертификата не удалась (_ssl .с:833)