Falha na verificação do certificado SSL em python no Mavericks

Estou com um problema persistente de verificação de SSL.

SSL: CERTIFICATE_VERIFY_FAILED

Eu descobri o erro ao criar um aplicativo Django que tinha usuários autenticados usando o Mozilla Persona.

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

Eu recebo umSSL: CERTIFICATE_VERIFY_FAILED rastreando de voltarequests paraurllib3 parassl:

...
"/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)
Diferença entre python3 e python2

Aqui é onde começa a ficar interessante: Não recebo o mesmo problema ao usar python2.7:

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

Meu primeiro pensamento foi que as duas versões dorequests pode estar usando certs diferentes [1], então fiquei bastante surpreso ao descobrir que os dois arquivos eram exatamente iguais:

(bash)$ diff `python3.4 -c "import requests; print(requests.certs.where())"` \
             `python2.7 -c "import requests; print requests.certs.where()"`
# no diff
Erro recriado no openssl e resolvido usando -CAFile

Curiosamente, o problema não se limita ao python3.4 [2].

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

Editar Um comentário de Steffen me informou que esse método de "depuração" não é realmente informativo, poiss_client espera um -CApath para verificar. No entanto, o fato de eu poder especificar o mesmo certificado que orequests pacote está usando e eu não recebo o mesmo erro ainda é interessante:

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

Neste ponto, estou completamente fora do meu elemento. Eu não sei é se isso é realmente umopenssl problema ou algo sobre o OSX Mavericks [3]. Aqui está a versão do openssl que estou usando:

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

Para soluções específicas do SO, tentei limpar meu KeyChain de login [4], sem sucesso.

Problemas com pip

Há uma última evidência que pode ou não ser relevante. O python3.4 é enviado com o pip intacto. No entanto, o comando pip3 é inútil para mim. Não importa o que eu tente instalar:

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

Eu recebo:

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

Embora este não seja (explicitamente) um erro SSL, parece semelhante [5] e uma solução alternativa bem-sucedida foi instalar uma versão mais antiga do pip usandoeasy_install no meuvirtualenvs [5] Estou cruzando os dedos que as duas questões estão relacionadas.

Recapitular:

Procurando soluções possíveis para erro de falha do certificado SSL (sem usarverify = False norequests chamadas).Eu recebo o erro no python3.4, mas não no python2.7, embora o cert.pem usado nos dois casos seja exatamente o mesmo.Embora eu possa recriar um erro SSL usandoopenssl s_client -connect Eu posso evitá-lo especificando-CAFile para o cert.pem usado pela biblioteca de solicitações.Meu melhor palpite é que esse é um problema específico do Mavericks, mas não tenho idéia de como proceder.Espero encontrar uma solução que também me permita usar o pip3 para instalar pacotes python3.4 conforme o esperado.

Obrigado pela ajuda!

[1]: python2.7 na minha máquina foi instalado usando o Enthought. Mas instalar uma versão do sistema do python2.7 e a biblioteca de solicitações também funciona.

[2]: Vejaopenssl, python solicita erro: "falha na verificação do certificado" para um problema semelhante usando python 2.7

[3]: Parece que o Mavericks introduziu uma mudança no openssl?http://curl.haxx.se/mail/archive-2013-10/0036.html

[4]: Clearning KeyChain.app a partir daqui:https://superuser.com/a/721629/261875

[5]: erro de SSL com pip3:https://stackoverflow.com/a/22051466/2506078

questionAnswers(2)

yourAnswerToTheQuestion