Python请求抛出SSL错误

Python请求抛出SSL错误,python,macos,ssl,python-requests,Python,Macos,Ssl,Python Requests,以下是以下内容: 我刚刚在Mac OSX 10.8.5上安装了请求。我第一次尝试执行请求时失败,因为缺少证书: SSLError:[Errno 1]\u ssl.c:504:error:14090086:ssl例程:SSL3\u GET\u SERVER\u证书:证书验证失败 上面的线程说要查找/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/re‌​quests/cacert.pem但实

以下是以下内容:

我刚刚在Mac OSX 10.8.5上安装了
请求
。我第一次尝试执行
请求时失败,因为缺少证书:

SSLError:[Errno 1]\u ssl.c:504:error:14090086:ssl例程:SSL3\u GET\u SERVER\u证书:证书验证失败

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

  • 进一步的线程和
    请求
    文档说要安装
    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
    

谢谢

注意,您使用的是
HTTPS
。如报告中所述

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

这里有几种方法可以解决这个问题:

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

如果遇到以下错误之一:

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.
对于SHA256的全面管理,至少需要OpenSSL 0.9.8o。OpenSSl 0.9.7m仅确保服务器的部分管理 仅限模式

通过检查您的
openssl
版本 如果您的版本小于OpenSSL0.9.8o,则必须更新其版本(OS X):

如果不起作用,请尝试以下方法:

brew uninstall openssl
rm -rf /usr/local/openssl
brew install openssl
  • OSX10.10.3
    之前安装的
    openssl
    有一个问题,重新安装它可以解决这个问题
  • 这些命令行将卸载
    openssl
    ,从硬盘中删除其文件夹并重新安装(更新版本)
安装
certifi
取自

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

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

为了安全起见,我们建议经常升级certifi

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

pip install certifi
希望这能解决问题

使用不同版本的OpenSSL和请求 通过使用Google查看,我发现Python 2中的OpenSSL存在一个问题:

但是,我正在使用
Python 2.7.6
请求2.2.1
OpenSSL 1.0.1f 2014年1月6日
,并且一切都正常运行

通过证书 在其他情况下,您可能需要告诉
请求。如果主机的证书是由您签署的,则获取证书文件的路径

requests.get("https://api.github.com/events", verify=True, cert=['/path/to/my/ca.crt'])
将verify参数设置为False(不推荐!) 如果要避免证书验证,必须将
verify=False
传递给
请求.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]>
$python script.py

重要的:非常糟糕的想法;您可能会受到攻击,这是一个严重的安全漏洞。

您的问题是什么?您需要清楚地指定希望社区帮助您解决的问题。这种错误在较旧的OpenSSL版本和使用SHA-256签名的证书中很常见。您正在使用哪个版本的OpenSSL(
OpenSSL版本
)?
OpenSSL 0.9.8y 2013年2月5日
请不要建议在不描述负面影响的情况下禁用证书验证(中间人攻击)它应该只用于测试,或者如果安全性不相关的话。@SteffenUllrich,但我就是这么做的。我没有提到MITMA,但我说了“相信主人”。这还不够好吗?这不是信任主人的问题。TLS没有说明主机的可信程度,只有在证书与主机名匹配并且由可信CA颁发时才这样做。您可能不信任
attacker.example.com
,但证书可能仍然可以使用。禁用验证的问题是,您根本不知道是否与主机对话。@SteffenUllrich,您可以查看我更新的帖子吗?是的,我使用的是https——这是requests文档中的示例。
import requests
res = requests.get("https://api.github.com/events", verify=False)
print res
$ python script.py
<Response [200]>