【问题标题】:Python requests throwing SSL errorsPython 请求引发 SSL 错误
【发布时间】:2015-08-30 02:33:23
【问题描述】:

这是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
    

谢谢!

【问题讨论】:

  • 您的问题是什么?您需要明确说明您希望社区帮助您解决的问题。
  • 这种错误在较旧的 OpenSSL 版本和使用 SHA-256 签名的证书中很常见。您使用的是哪个版本的 OpenSSL (openssl version)?
  • OpenSSL 0.9.8y 5 Feb 2013

标签: python macos ssl python-requests


【解决方案1】:

请注意,您使用的是HTTPS。如Requests manual中所述

要检查主机的 SSL 证书,您可以使用 verify 参数 [...] 默认情况下,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
  • OS X 10.10.3 之前安装openssl 存在问题,重新安装即可解决此问题
  • 这些命令行将卸载openssl,从硬盘中删除其文件夹并重新安装(更新版本)

安装certifi

取自here

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

从 Requests 版本 2.4.0 开始,Requests 将尝试使用 如果系统上存在 certifi 的证书。这允许 用户无需更新其受信任的证书 更改在他们的系统上运行的代码。

为了安全起见,我们建议经常升级证书!

换句话说,尝试安装certifi,如果你有Request 2.4.0或更新:

pip install certifi

希望这能解决问题。

使用不同版本的 OpenSSL 和请求

使用谷歌查看,我发现 Python 2 中的 OpenSSL 存在问题:

但是,我正在使用 Python 2.7.6Requests 2.2.1OpenSSL 1.0.1f 6 Jan 2014,并且一切运行正常。

通过证书

在其他情况下,如果主机的证书由您签名,您可能需要告诉requests.get 证书文件的路径。

requests.get("https://api.github.com/events", verify=True, cert=['/path/to/my/ca.crt'])

将验证参数设置为 False(不推荐!)

如果您想避免证书验证,您必须将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

终端:

$ python script.py
<Response [200]>

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

【讨论】:

  • 请不要在不描述负面影响(中间人攻击)的情况下建议禁用证书验证,并且它应该只用于测试或安全性无关紧要的情况。
  • @SteffenUllrich 但这就是我所做的。我没有提到 MITMA,但我确实说过“trust the host”。这还不够好吗?
  • 这不是信任主机的问题。仅当证书与主机名匹配并且由受信任的 CA 颁发时,TLS 才不会说明主机的可信度。您可能不信任attacker.example.com,但证书可能仍然没问题。禁用验证的问题是您根本不知道您是否与主机交谈。
  • @SteffenUllrich,你能看看我更新的帖子吗? 10 倍。
  • 是的,我使用的是 https——这是请求文档中的示例。
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多