关于python:使用Requests包时出现SSL InsecurePlatform错误

SSL InsecurePlatform error when using Requests package

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

我过去曾多次使用过Requests并且从未遇到过这个问题,但似乎在使用Requests进行https请求时,我得到了一个InsecurePlatform异常。

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

1
2
3
4
5
6
/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并禁用警告或提供证书。


使用隐藏的安全功能:

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包。

上面的发行清单不完整。

解决方法(参见@TomDotTom的原始答案):

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

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

如果您的pip本身受InsecurePlatformWarning影响并且无法从PyPI安装任何内容,则可以使用此分步指南修复它,以手动部署额外的python包。


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

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

1
pip install --upgrade ndg-httpsclient

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

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


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

If you know what you are doing and would like to disable this and
other warnings

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

编辑/更新:

以下也应该有效:

1
2
3
4
5
import logging
import requests

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


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

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

你可以阅读请求的代码。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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.
    ...
   """


如果您无法将Python版本升级到2.7.9,并且想要禁止警告,

您可以将"请求"版本降级到2.5.3:

1
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


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

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

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

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

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


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

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()


上周我在Ubuntu 14.04(使用Python 2.7.6)之后找到了包含来自deb.sury.orglibssl1.1:amd64apt-get dist-upgrade

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

要修复错误,我需要做的就是成为root(使用su--login开关)并让certbot-auto自行升级。即:

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

而不是通常从root的crontab运行的东西:

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

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


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

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

解决了这个问题。


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

/usr/lib/python3/dist-packages/urllib3/connectionpool.py:794:
InsecureRequestWarning: Unverified HTTPS request is being made. Adding
certificate verification is strongly advised. See:
https://urllib3.readthedocs.org/en/latest/security.html
InsecureRequestWarning)

做:

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

verify=False

是关键,以下不擅长:

requests.packages.urllib3.disable_warnings()

要么

urllib3.disable_warnings()

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


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

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


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

1
2
3
4
5
import requests
import urllib3

# Suppress InsecureRequestWarning: Unverified HTTPS
urllib3.disable_warnings()

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

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

具体来说,'pip安装请求[安全]'失败了,因为CentOS 5上的openssl版本是0.9.8e,密码学不再支持1.4.0。

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

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

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

1
2) pip install 'requests[security]'

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

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

1
yum install openssl-devel

允许加密构建


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

于Debian / Ubuntu

安装依赖项

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

升级pip并安装包

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

如果要删除依赖项

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