Указав моему браузеру 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?