python запросов поднял SSLError, как это исправить? - PullRequest
1 голос
/ 03 апреля 2020
import requests
s = requests.session()
print(s.get('https://imagetwist.com/')) # print(s.get('https://img119.imagetwist.com/'))

Ошибка:

requests.exceptions.SSLError: HTTPSConnectionPool(host='imagetwist.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

Если я запрашиваю субдомен (https://img119.imagetwist.com/), он работает нормально.

Может кто-нибудь мне помочь, tks !

Python 3.6.9, Ubuntu 18.04.1

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Обновление

Я позволил себе связаться с imagetwist.com и сообщить им о проблеме. В течение часа они исправили проблему с полной цепочкой сертификатов. Слава Imagetwist!

-

Избыточная отладочная информация для похожих проблем:

Неправильная конфигурация сервера imagetwist.com - он не предоставляет полный сертификат цепь обратно к общему доверенному CA. В то время как Chrome (и другие) заполнят пробелы, библиотека Python не может это сделать.

Сравните результаты с:

openssl s_client -connect img119.imagetwist.com:443 -showcerts
openssl s_client -connect imagetwist.com:443 -showcerts

Обычно сервер предоставит список сертификатов, которые будут "синхронизированы" с сертификатом центра сертификации в вашем ca_bundle (файл / каталог, содержащий CA, распознанные вами и вашим компьютером).

Существует три варианта:

  1. Попросите imagetwist.com исправить их конфигурацию (Удачи!)
  2. Добавьте их сертификат в ваш ca_bundle (Вам придется обновлять каждый раз, когда они обновляют сертификат)
  3. Добавить промежуточные сертификаты для вашего ca_bundle.

Вариант 3, вероятно, является лучшим долгосрочным решением, пока imagetwist не исправит их настройку.

В зависимости от вашей установки Python, вам нужно будет добавить следующее к вашему ca_bundle, которое заполнит недостающую цепочку сертификатов на вашем компьютере:

----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----

Этот промежуточный сертификат получен с правильно настроенного сервера (img119.im agetwist.com) instance.

Затем я проверил его двумя способами:

  1. Связка ключей Apple: openssl verify sectigo.crt
  2. Использование преобразованной цепочки сертификатов Mozilla: curl https://curl.haxx.se/ca/cacert.pem | openssl verify -CAfile /dev/stdin sectigo.crt

Оба результата приводят к:

sectigo.crt: OK
Chain:
depth=0: C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA (untrusted)
depth=1: C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority

Следовательно, пропущенный промежуточный сертификат (Secti go) проверяется CA "USERTRUST Network", присутствующим в цепочке ключей Apple по умолчанию и пакет CA от Mozilla.

1 голос
/ 03 апреля 2020

Ошибка объясняет, что не может подтвердить SSL сертификацию по HOST.

, поэтому вы должны использовать verify=False для этого случая.

Проверка Проверка SSL CERT

И здесь Отключение предупреждений SSL

import requests
import urllib3


urllib3.disable_warnings()

with requests.Session() as req:
    r = req.get("https://imagetwist.com/", verify=False)
    print(r)
...