Почему модуль Python SSL не может проверить сертификат graph.facebook.com? - PullRequest
4 голосов
/ 09 октября 2011

Указав моему браузеру https://graph.facebook.com/me,, я получаю зашифрованное HTTPS-соединение, цепочкой сертификатов которого является:

  • DigiCert High Assurance EV Root CA (root)
  • DigiCert High Assurance CA-3
  • *. Facebook.com

Итак, я загрузил корневой сертификат с https://www.digicert.com/digicert-root-certificates.htm (я также экспортировал его из своего браузера, diff показывает, что это одно и то же), и попытался использовать встроенный модуль Python SSL для проверки подлинности соединения с graph.facebook.com.

Я только что выполнил пример http://docs.python.org/library/ssl.html#client-side-operation, замена ca_cert на «DigiCertHighAssuranceEVRootCA.crt» и адрес на graph.facebook.com.Попытка подключения завершается неудачей, за исключением:

ssl.SSLError: [Errno 1] _ssl.c:499: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Если я попытаюсь использовать тот же код и сертификат для ev-root.digicert.com (это адрес, предоставленный DigiCert для тестирования, если клиент может проверить свой сертификат) все работает хорошо.Через браузер я мог проверить, что цепочка, используемая в этом соединении:

  • DigiCert High Assurance EV Root CA (root)
  • DigiCert High Assurance EV CA-1
  • ev-root.digicert.com

Запустив ssl.get_server_certificate (('graph.facebook.com', 443)), я получаю тот же сертификат, что и "* .facebook.com"в моем браузере это означает, что и код Python, и мой браузер получают один и тот же сертификат для проверки.

Почему Chrome может проверять graph.facebook.com с указанным корневым сертификатом, Python может проверять другой сайт с таким же корневым сертификатом, но Python не может проверить graph.facebook.com?

Ответы [ 2 ]

4 голосов
/ 30 октября 2011

Я получил ответ из списка рассылки OpenSSL. Похоже, что «DigiCert High Assurance EV Root CA» был подписан другим центром сертификации до того, как был подписан самостоятельно. Сейчас существует две версии сертификата. Один связан с реализациями SSL и предоставляется для загрузки DigiCert, который является самоподписанным и может использоваться в качестве корневого центра сертификации для проверки других сертификатов, которые он подписывает. Другая версия - это версия, возвращаемая сервером Facebook в процессе рукопожатия SSL, который подписан некоторым сертификатом Entrust. Оба имеют один и тот же открытый ключ и ключ.

NSS, реализация SSL Firefox и Chrome, по-видимому, правильно следует спецификации X.509 и игнорирует последний сертификат в цепочке, отправленный сервером, и использует свою собственную доверенную версию «DigiCert High Assurance EV Root CA» для проверить цепь. Реализация Python завершена через OpenSSL, который проверяет «DigiCert High Assurance CA-3» с использованием сертификата, предоставленного хостом, и, в свою очередь, пытается проверить этот последний. Поскольку он был подписан другим центром сертификации, и я не предоставил этот сертификат, он не работает. Я не думаю, что это поведение правильно, потому что, поскольку я уже доверяю сертификату в середине цепочки, теоретически мне не нужно проверять остальное.

Моим решением было предоставить модулю ssl сертификат Entrust, который подтверждает «DigiCert High Assurance EV Root CA».

0 голосов
/ 21 сентября 2017

Если вы работаете за прокси-сервером, вы также можете открыть https://graph.facebook.com в своем браузере и проверить путь сертификации оттуда.Вполне возможно, что ваш прокси-сервер выступает в роли эмитента сертификата сайта.В этом случае укажите свой прокси-сертификат, распакуйте его в pem-файл и добавьте содержимое в сертификат Python certifi cacert.pem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...