TL; DR - сервер неправильно настроен.Либо исправьте сервер, передайте verify=ssl.CERT_NONE
, либо загрузите и передайте сертификат www.magidglove.com явно.
Проблема здесь на сервере, а не на клиенте.Сервер настроен только на возврат своего собственного сертификата, чего недостаточно для того, чтобы клиент доверял ему.Обычно серверы должны быть настроены на возврат полной цепочки сертификатов.
Чтобы диагностировать это, вы можете использовать openssl
для просмотра некоторой необработанной информации о возвращенной цепочке сертификатов:
$ openssl s_client -connect www.google.com:443 -showcerts -servername www.google.com
CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = Google Internet Authority G3
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = www.google.com
verify return:1
... snipped the rest of the output ...
Вы видите, что 3 сертификата были возвращены сервером, и они были проверены в обратном порядке.Сертификат GlobalSign является доверенным для библиотеки certifi
, сертификат на depth=1
был создан сертификатом на depth=2
, а последний сертификат CN=www.google.com
был создан сертификатом на depth=1
.
Теперь давайте сравним это с сервером, к которому вы пытались подключиться:
$ openssl s_client -connect www.magidglove.com:443 -showcerts -servername www.magidglove.com
CONNECTED(00000003)
depth=0 businessCategory = Private Organization, jurisdictionC = US, jurisdictionST = Illinois, serialNumber = 00043176, C = US, ST = Illinois, L = Romeoville, O = "Magid Glove and Safety Manufacturing Company, L.L.C.", OU = web site, CN = www.magidglove.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 businessCategory = Private Organization, jurisdictionC = US, jurisdictionST = Illinois, serialNumber = 00043176, C = US, ST = Illinois, L = Romeoville, O = "Magid Glove and Safety Manufacturing Company, L.L.C.", OU = web site, CN = www.magidglove.com
verify error:num=21:unable to verify the first certificate
verify return:1
Из этого вывода вы можете увидеть несколько вещей: - Сервер вернул только один сертификат - Клиентпопытался проверить сертификат и не смог
Требуется некоторое знание ssl, чтобы понять, что причина, по которой он не мог проверить, заключалась в том, что он не доверяет сертификату, но теперь, когда мы знаем, что мыможно увидеть, что возвращение сервером полной цепочки сертификатов исправит это.Я подозреваю, что причина, по которой Chrome и другие браузеры не сообщают об ошибке, заключается в том, что сам браузер знает о DigiCert, поэтому он не требует полной цепочки.