使用请求包时出现SSL InsecurePlatform错误

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

我在过去使用过很多次请求,从来没有遇到过这个问题,但似乎当使用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,要么禁用警告,要么提供证书。

200077 次浏览

使用有点隐藏的安全特性:

< p > pip install requests[security]pip install pyOpenSSL ndg-httpsclient pyasn1 < / p >

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

  • pyOpenSSL
  • 密码学
  • idna

请注意,这不是python-2.7.9 +所必需的。

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

  • Debian/Ubuntu - python-dev libffi-dev libssl-dev包。

  • Fedora - openssl-devel python-devel libffi-devel包。

上面的发行版列表不完整。

解决方案 (请参阅@TomDotTom的原始回答)

如果你不能安装一些必要的开发包,还有一个选项可以禁用该警告:

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

如果你的pip本身受到InsecurePlatformWarning的影响,不能从PyPI安装任何东西,可以用这个分步指南来修复,手动部署额外的python包。

如果你是无法升级你的Python版本到2.7.9,并且想要抑制警告,

你可以降低你的“要求”版本到2.5.3:

sudo pip install requests==2.5.3
< p >版本: http://fossies.org/diffs/requests/2.5.3_vs_2.6.0/requests/packages/urllib3/util/ssl_.py-diff.html < / p >

Requests 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

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

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.
...
"""

我没有在生产中使用它,只在一些测试运行中使用。并重申urllib3文档 .

如果你知道你在做什么,想要禁用这个和 其他警告< / p >

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

编辑/更新:

以下也可以:

import logging
import requests


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

这个答案是不相关的,但如果你想消除警告并从请求中得到以下警告:

< p > <代码> InsecurePlatformWarning /usr/local/lib/python2.7/ disti -packages/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: true SSLContext对象不可用。这将阻止urllib3正确配置SSL,并可能导致某些SSL连接失败。

你可以通过在你的python代码中添加以下行禁用它:

requests.packages.urllib3.disable_warnings()

对于我没有工作,我需要升级pip....

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

我刚刚在CentOS 5服务器上遇到了类似的问题,我在/usr/local中安装了python 2.7.12,上面是一个旧版本的python2.7。目前在此服务器上无法升级到CentOS 6或7。

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

具体来说,“pip安装请求[security]”失败,因为CentOS 5上的openssl版本是0.9.8e,不再受加密> 1.4.0的支持。

为了解决OPs最初的问题,我做了:

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

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

2) pip install 'requests[security]'

此命令现在安装,因为它不会尝试安装加密> 1.4.0。

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

yum install openssl-devel

让密码学得以建立

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

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

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

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


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

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

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

修复了问题。

下面是我在Python 3.6上的工作方式:

import requests
import urllib3


# Suppress InsecureRequestWarning: Unverified HTTPS
urllib3.disable_warnings()

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

import requests
requests.packages.urllib3.disable_warnings()

上周我在Ubuntu 14.04 (Python 2.7.6)上做了一个包含deb.sury.org中的libssl1.1:amd64apt-get dist-upgrade之后,就出现了这个问题。

由于我从cron作业中运行certbot-auto renew,所以我也使用--no-self-upgrade来减少不定期的维护。这似乎是问题的根源。

要修复这个错误,我所需要做的就是成为根用户(使用su--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的crontab运行:

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

在此之后,让sencrypt renwals再次正常运行。

如果你只是想停止不安全的警告,比如:

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

做的事:

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

验证= False

关键是,以下几种都不擅长:

requests.packages.urllib3.disable_warnings ()

urllib3.disable_warnings ()

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

我对
也有同样的问题 Mac < br > Pycharm社区版2019.3
Python解释器3.6。< br > 用20.0.2升级pip对我有用 Pycharm --> Preferences --> Project Interpreter --> click on pip --> specify version 20.0.2 --> Install package < / p >

在我的例子中,我正在使用一个旧的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