Python请求抛出SSL错误

时间:2015-06-14 15:05:02

标签: python macos ssl python-requests

这是SSLError using requests for python的后续内容:

我刚刚在Mac OSX 10.8.5上安装了requests。我第一次尝试requests.get失败证书失败了:

SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

  • 上面的帖子说要查找/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/re‌​quests/cacert.pem,但实际上我甚至没有.../site-packages/requests目录。我不清楚这是否应该由安装添加(我使用pip

  • 其他主题和requests文档说要安装certifi,所以我做了。但现在我得到了一个不同的错误:

    python -c 'import requests; requests.get("https://api.github.com/events")'    /usr/lib/anaconda/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
      InsecurePlatformWarning
    Traceback (most recent call last):
    ...
      File "/usr/lib/anaconda/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
        raise SSLError(e, request=request)
    requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm
    

谢谢!

1 个答案:

答案 0 :(得分:7)

请注意,您正在使用HTTPS。如Requests manual

中所述
  

要检查主机的SSL证书,可以使用verify参数[...]默认情况下,验证设置为True

以下几种解决方法:

更新OpenSSL(可能会解决您的问题)

取自here

  

如果您遇到以下错误之一:

error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm
error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm
The software you are using might be compiled with a version too old of OpenSSL that does not take certificates signed with sha256WithRSAEncryption into account.
     

至少需要OpenSSL 0.9.8o来管理SHA256。 OpenSSl 0.9.7m仅为服务器确保部分管理   仅限模式。

通过

检查openssl版本
openssl version
OpenSSL 1.0.1k-fips 8 Jan 2015

如果版本小于OpenSSL0.9.8o,则必须更新其版本(OS X):

brew update
brew install openssl
brew link --force openssl

如果这不起作用,请尝试这种方式:

brew uninstall openssl
rm -rf /usr/local/openssl
brew install openssl
  • openssl之前安装OS X 10.10.3并重新安装它的问题已修复
  • 这些命令行将卸载{​​{1}},从硬盘中删除其文件夹并重新安装(更新后的版本)

安装openssl

取自here

  

默认情况下,请求捆绑了一组它信任,来源的根CA.   来自Mozilla信托商店。但是,这些只更新一次   每个请求版本。这意味着如果你固定一个请求版本   你的证书可能会变得非常过时。

     

从请求版本2.4.0开始,请求将尝试使用   来自certifi的证书(如果它存在于系统中)。这允许   用户无需更新其可信证书   更改在其系统上运行的代码。

     

出于安全考虑,我们建议经常升级证书!

换句话说,如果您有certifi或更新版本,请尝试安装certifi

Request 2.4.0

希望这可以解决问题。

使用不同版本的OpenSSL和请求

使用Google调查,我发现Python 2中的OpenSSL存在问题:

但是,我使用pip install certifi Python 2.7.6Requests 2.2.1,一切都正常运行。

传递证书

在其他情况下,如果您签署了主机证书,则可能需要告知OpenSSL 1.0.1f 6 Jan 2014证书文件的路径。

requests.get

将验证参数设置为False(NOT RECOMMENDED!)

如果您想避免证书验证,则必须将requests.get("https://api.github.com/events", verify=True, cert=['/path/to/my/ca.crt']) 传递给verify=False方法。

request.get

或来自python -c 'import requests; requests.get("https://api.github.com/events", verify=False)' 档案:

script.py

终端:

import requests
res = requests.get("https://api.github.com/events", verify=False)
print res

重要 :非常糟糕的主意;您可能被MITM攻击,这是一个重要的安全漏洞。