使用Requests包时出现SSL InsecurePlatform错误

时间:2015-03-17 12:43:35

标签: python ssl python-requests

我正在使用Python 2.7.3和请求。我通过pip安装了Requests。我相信它是最新版本。我在Debian Wheezy上运行。

我过去曾多次使用过Requests并且从未遇到过此问题,但似乎在使用Requests发出https请求时,我得到了InsecurePlatform例外。

错误提及urllib3,但我没有安装。我确实安装了它以检查它是否解决了错误,但它没有。

/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3
/util/ssl_.py:79: 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.

关于我为什么会这样做的任何想法?我已按照错误消息中的说明检查了文档,但文档说要导入urllib3并禁用警告或提供证书。

16 个答案:

答案 0 :(得分:384)

使用隐藏的安全功能:

pip install requests[security] 要么 pip install pyOpenSSL ndg-httpsclient pyasn1

两个命令都安装以下额外包:

  • pyOpenSSL
  • 加密
  • IDNA

请注意,python-2.7.9+不需要这样做。

如果pip install失败并出现错误,请检查您的系统中是否安装了libffilibsslpython所需的开发包使用分发包管理器< /强>:

  • Debian / Ubuntu - python-dev libffi-dev libssl-dev个套餐。

  • Fedora - openssl-devel python-devel libffi-devel个套餐。

上面的发行列表不完整。

解决方法see the original answer by @TomDotTom

如果您无法安装某些必需的开发包,还可以选择禁用该警告:

import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()

如果您的pip本身受InsecurePlatformWarning影响并且无法从PyPI安装任何内容,可以使用this step-by-step guide修复它以手动部署额外的python包。

答案 1 :(得分:68)

请求2.6为2.7.9之前的python用户引入了此警告,只提供了库存SSL模块。

假设你无法升级到更新版本的python,这将安装更多最新的python SSL库:

pip install --upgrade ndg-httpsclient 

然而,在没有pyOpenSSL的构建依赖性的某些系统上,这可能会失败。在debian系统上,在上面的pip命令之前运行它应该足以使pyOpenSSL构建:

apt-get install python-dev libffi-dev libssl-dev

答案 2 :(得分:18)

我不是在生产中使用它,只是一些测试跑步者。并重申urllib3 documentation

  

如果您知道自己在做什么,并希望禁用此功能   其他警告

import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()

编辑/更新:

以下内容也应该有效:

import logging
import requests

# turn down requests log verbosity
logging.getLogger('requests').setLevel(logging.CRITICAL)

答案 3 :(得分:7)

如果您无法升级您的Python版本为2.7.9,并且想要取消警告,

您可以将“请求”版本降级为2.5.3:

sudo pip install requests==2.5.3

关于版本: http://fossies.org/diffs/requests/2.5.3_vs_2.6.0/requests/packages/urllib3/util/ssl_.py-diff.html

答案 4 :(得分:7)

事实上,你可以试试这个。

requests.post("https://www.google.com", verify=False)

您可以阅读请求的代码。

"C:\Python27\Lib\site-packages\requests\sessions.py"

class Session(SessionRedirectMixin):
......
 def request(self, method, url,
    params=None,
    data=None,
    headers=None,
    cookies=None,
    files=None,
    auth=None,
    timeout=None,
    allow_redirects=True,
    proxies=None,
    hooks=None,
    stream=None,
    verify=None,  # <========
    cert=None):
    """
    ...
    :param verify: (optional) if True, the SSL cert will be verified.
         A CA_BUNDLE path can also be provided.
    ...
    """

答案 5 :(得分:5)

这里给出的所有解决方案都没有帮助(我受限于python 2.6.6)。我在一个简单的开关中找到答案传递给pip:

$ sudo pip install --trusted-host pypi.python.org <module_name>

这告诉pip从pypi.python.org获取模块是可以的。

对我来说,问题是我公司的防火墙背后的代理,使它看起来像某些服务器的恶意客户端。万岁安全。

更新:请参阅@Alex的 answer 可以更改PyPi域中的更改,以及可以添加的其他--trusted-host选项。 (我在这里复制/粘贴,但他的回答,所以+1他)

答案 6 :(得分:3)

这个答案是无关紧要的,但如果您想摆脱警告并从请求中获得以下警告:

InsecurePlatformWarning /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:79: 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.

您可以通过在python代码中添加以下行来禁用

requests.packages.urllib3.disable_warnings()

答案 7 :(得分:1)

我必须先去bash(来自ZSH)。然后

sudo -H pip install 'requests[security]' --upgrade

修复了问题。

答案 8 :(得分:1)

上周,在我apt-get dist-upgrade libssl1.1:amd64 deb.sury.org之后,我在Ubuntu 14.04(使用Python 2.7.6)上找到了这个。

由于我从cron作业运行certbot-auto renew,我还使用--no-self-upgrade来减少计划外维护。这似乎是麻烦的根源。

要解决此错误,我需要做的就是成为root用户(使用su&#39; --login切换)并让certbot-auto自行升级。我:

sudo su --login
/usr/local/bin/certbot-auto renew 
# ... Upgrading certbot-auto 0.8.1 to 0.18.2... blah blah blah ...

而不是通常从root&#39; crontab运行的内容:

5 7 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade

之后,letsencrypt renwals再次正常运行。

答案 9 :(得分:0)

对我来说,没有工作,我需要升级点....

于Debian / Ubuntu

安装依赖项

sudo apt-get install libpython-dev libssl-dev libffi-dev

升级pip并安装软件包

sudo pip install -U pip
sudo pip install -U pyopenssl ndg-httpsclient pyasn1

如果要删除依赖项

sudo apt-get remove --purge libpython-dev libssl-dev libffi-dev
sudo apt-get autoremove

答案 10 :(得分:0)

我在CentOS 5服务器上遇到了类似的问题,我在/ usr / local中安装了python 2.7.12,而不是更旧版本的python2.7。升级到CentOS 6或7现在不是这个服务器上的一个选项。

某些python 2.7模块仍然存在于较旧版本的python中,但是pip未能升级,因为CentOS 5软件包不支持更新的加密软件包。

具体来说,&#p;安装请求[安全]&#39;因为CentOS 5上的openssl版本是0.9.8e而已经失败了,密码学不再支持这种版本了。 1.4.0。

为了解决OP的原始问题,我做了:

1) pip install 'cryptography<1.3.5,>1.3.0'.  

这个安装的加密1.3.4与openssl-0.9.8e一起使用。密码学1.3.4也足以满足以下命令的要求。

2) pip install 'requests[security]'

现在安装此命令是因为它没有尝试安装加密&gt; 1.4.0。

请注意,在Centos 5上我还需要:

yum install openssl-devel

允许加密构建

答案 11 :(得分:0)

以下是它在Python 3.6上的工作方式:

import requests
import urllib3

# Suppress InsecureRequestWarning: Unverified HTTPS
urllib3.disable_warnings()

答案 12 :(得分:0)

不要安装pyOpenSSL,因为它很快就会被弃用。目前最好的方法是 -

import requests
requests.packages.urllib3.disable_warnings()

答案 13 :(得分:0)

如果您只想停止不安全警告,请执行以下操作:

  

/usr/lib/python3/dist-packages/urllib3/connectionpool.py:794:   InsecureRequestWarning:正在进行未验证的HTTPS请求。添加   强烈建议进行证书验证。看到:   https://urllib3.readthedocs.org/en/latest/security.html   InsecureRequestWarning)

做的:

requests.METHOD("https://www.google.com", verify=False)
  

验证=假

是关键,以下不擅长:

  

requests.packages.urllib3.disable_warnings()

  

urllib3.disable_warnings()

但是,您必须知道可能会带来潜在的安全风险

答案 14 :(得分:0)

我在
遇到同样的问题 Mac
Pycharm社区版2019.3
Python解释器3.6。
使用20.0.2升级点对我有用。
Pycharm --> Preferences --> Project Interpreter --> click on pip --> specify version 20.0.2 --> Install package

答案 15 :(得分:0)

在我的情况下,正在处理旧的 ubuntu 可信映像并尝试安装 python dateutil。我必须首先使用以下内容将 python 升级到 2.7.12:

add-apt-repository -y ppa:fkrull/deadsnakes-python2.7
apt-get -y update
apt install -y --force-yes python2.7-minimal
pip install python-dateutil