Ошибка проверки SSL-сертификата в python на Mavericks

Я застрял на постоянной проблеме проверки SSL.

SSL: CERTIFICATE_VERIFY_FAILED

Я обнаружил ошибку при создании приложения Django, в котором пользователи проходили аутентификацию с помощью Mozilla Persona.

(python3.4)> import requests
(python3.4)> requests.get('https://verifier.login.persona.org')

Я получаюSSL: CERTIFICATE_VERIFY_FAILED прослеживая отrequests вurllib3 вssl:

...
"/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 805, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)

...
"/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests-2.4.1-py3.4.egg/requests/packages/urllib3/connectionpool.py", line 543, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)

...
"/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests-2.4.1-py3.4.egg/requests/adapters.py", line 420, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)
Разница между python3 и python2

Вот где это начинает становиться интересным: у меня не возникает та же проблема при использовании python2.7:

(python2.7)> import requests
(python2.7)> requests.get('https://verifier.login.persona.org')
<Response [200]>

Моей первой мыслью было, что две версииrequests возможно, использовали разные сертификаты [1], поэтому я был очень удивлен, обнаружив, что два файла были абсолютно одинаковыми:

(bash)$ diff `python3.4 -c "import requests; print(requests.certs.where())"` \
             `python2.7 -c "import requests; print requests.certs.where()"`
# no diff
Ошибка воссоздана в openssl и решена с помощью -CAFile

Интересно, что проблема не ограничивается python3.4 [2].

(bash)$ openssl s_client -connect github.com:443
...
Verify return code: 20 (unable to get local issuer certificate)

редактировать Комментарий Штеффена сообщил мне, что этот метод «отладки» на самом деле не информативен, так какs_client ожидает -CApath для проверки. Однако тот факт, что я могу указать тот же сертификат, что иrequests Пакет используется, и я не получаю ту же ошибку, все еще интересно:

(bash)$ openssl s_client -connect github.com:443 \
        -CAfile `python3 -c 'import requests; print(requests.certs.where())'`
...
Verify return code: 0 (ok)

На данный момент, я полностью вне моей стихии. Я не знаю, действительно ли этоopenssl или что-то о OSX Mavericks [3]. Вот версия openssl, которую я использую:

(bash)$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
Mavericks KeyChain.app

Для решений для конкретных ОС я попытался очистить свой логин KeyChain [4], но безрезультатно.

Проблемы с пипом

Есть одно последнее свидетельство, которое может иметь или не иметь отношение к делу. Python3.4 поставляется с неповрежденным пипом. Однако команда pip3 для меня бесполезна. Независимо от того, что я пытаюсь установить:

(bash)$ pip3 install [new-lib] # pip 1.5.6

Я получил:

Downloading/unpacking [new-lib]
    Cannot fetch index base URL https://pypi.python.org/simple/
    Could not find any downloads that satisfy the requirement [new-lib]
Cleaning up...
    No distributions at all found for [new-lib]
    Storing debug log for failure in ~/.pip/pip.log

Хотя это (явным образом) не ошибка SSL, похоже, она похожа [5], и успешным обходным решением было установить более старую версию pip с использованиемeasy_install в моемvirtualenvс [5]. Я скрещиваю пальцы, что эти два вопроса связаны.

Резюме:

Поиск возможных решений для ошибки сбоя сертификата SSL (без использованияverify = False вrequests звонки).Я получаю сообщение об ошибке в python3.4, но не в python2.7, хотя cert.pem, используемый в обоих случаях, абсолютно одинаков.Хотя я могу воссоздать ошибку SSL, используяopenssl s_client -connect Я могу избежать этого, указав-CAFile к cert.pem, используемому библиотекой запросов.Мое лучшее предположение состоит в том, что это проблема, характерная для Маверикс, но я не знаю, как поступить.Я надеюсь найти решение, которое также позволит мне использовать pip3 для установки пакетов python3.4, как и ожидалось.

Спасибо за вашу помощь!

[1]: python2.7 на моей машине был установлен с помощью Enthought. Но установка системной версии python2.7 и библиотеки запросов тоже работает.

[2]: см.openssl, Python запрашивает ошибку: «сбой проверки сертификата» для аналогичной проблемы с использованием Python 2.7

[3]: Кажется, Маверикс внес изменения в openssl?http://curl.haxx.se/mail/archive-2013-10/0036.html

[4]: Очистка KeyChain.app отсюда:https://superuser.com/a/721629/261875

[5]: ошибка SSL с pip3:https://stackoverflow.com/a/22051466/2506078

Ответы на вопрос(2)

Ваш ответ на вопрос