我陷入了持续的SSL验证问题。
我在构建让用户使用Mozilla Persona进行身份验证的Django应用程序时发现了错误。
(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)
这就是它开始变得有趣的地方:使用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
有趣的是,这个问题不仅限于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 [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
在我的virtualenv
s中使用安装较旧版本的pip
[5]。我指责这两个问题是相关的。
回顾:
verify = False
在requests
调用中不使用)。openssl s_client -connect
但可以通过指定-CAFile
请求库使用的cert.pem来避免该错误。谢谢你的帮助!
根据提供的其他信息,您似乎已经从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选项。 错误: