当前位置: 首页 > 面试题库 >

Mavericks上python中的SSL证书验证失败

陶法
2023-03-14
问题内容

我陷入了持续的SSL验证问题。

SSL:CERTIFICATE_VERIFY_FAILED

我在构建让用户使用Mozilla Persona进行身份验证的Django应用程序时发现了错误。

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

我得到一个SSL: CERTIFICATE_VERIFY_FAILED追溯从requestsurllib3ssl

...
"/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)

编辑 来自Steffen的评论告诉我,这种“调试”方法实际上没有提供信息,因为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

小牛KeyChain.app

对于特定于操作系统的解决方案,我尝试清除登录KeyChain [4],但无济于事。

点子问题

最后一点证据可能不相关。python3.4附带完整的pip。但是,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],成功的解决方法是easy_install在我的virtualenvs中使用安装较旧版本的pip
[5]。我指责这两个问题是相关的。

回顾:

  • 寻求SSL证书失败错误的解决方案(verify = Falserequests调用中不使用)。
  • 尽管在两种情况下使用的cert.pem完全相同,但我在python3.4中却收到了python2.7而不是错误。
  • 尽管我可以使用重新创建SSL错误,openssl s_client -connect但可以通过指定-CAFile请求库使用的cert.pem来避免该错误。
  • 我最好的猜测是,这是小牛队特有的问题,但是我不知道如何进行。
  • 我希望找到一个解决方案,该解决方案还允许我按预期使用pip3安装python3.4软件包。

谢谢你的帮助!


问题答案:

根据提供的其他信息,您似乎已经从python.org安装了32位版本的Python
3.4.1
。该版本主要用于OS X
10.5系统。因此,它与Apple随10.5提供的OpenSSL版本链接在一起。您可以使用python.org中的64位/
32位3.4.1安装程序来避免此问题;建议在OS X
10.6+上使用此版本,并与Apple的更新版本的OpenSSL链接。否则,您可以使用curl或浏览器从PyPI手动下载发行版,并pip从下载的文件中进行安装。



 类似资料:
  • 问题内容: 这段代码 给我这个错误 我对SSL几乎一无所知,但我曾尝试下载该站点的证书并使用该选项指向该文件,但是它没有用。我想念什么吗? 问题答案: 正如评论中已经指出的那样:从SSLLabs报告中可以看出,该网站的SSL实施不正确。该报告中有关您的问题的主要部分是: 该服务器的证书链不完整。等级上限为B。 这意味着服务器没有发送验证证书所需的完整证书链。这意味着您需要在验证时自行添加丢失的证书

  • 执行简单代码后: 我有下一个错误: Traceback(最近一次调用最后一次):文件"F:\Run\Lpror\Phyton\lib\site-包\urllib3\connectionpool.py",第597行,在urlopenf中。_prepare_proxy(conn)文件"F:\Run\Lpror\Phyton\lib\site-包\urllib3\connectionpool.py",第

  • 误差 PHP警告:stream_socket_client():SSL操作失败,代码为1。OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_Server_Certifice:证书验证失败

  • 假设我编写了两个Java应用程序:和,它们在两个独立的服务器上部署和运行(部署到和部署到

  • 尽管我保留了verify=false,但在Python中还是出现了ssl错误。你能告诉我如何避免吗?但是curl命令使用-k选项。 错误: