使用Requests包时出现SSL InsecurePlatform错误

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

我在过去很多次使用过Request,从来没有遇到过这个问题,但是看起来在使用Requests发出https请求时,我得到了一个InsecurePlatformexception。

错误提到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并禁用警告或提供证书。

使用一些隐藏的安全function:

pip install 'requests[security]'pip install pyOpenSSL ndg-httpsclient pyasn1

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

  • pyOpenSSL
  • encryption
  • IDNA

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

如果pip install失败,请检查您是否使用发行版的软件包pipe理器在您的系统中安装了libffilibsslpython所需的开发包:

  • Debian / Ubuntupython-dev libffi-dev libssl-dev软件包。

  • Fedoraopenssl-devel python-devel libffi-devel软件包。

上面的发行清单不完整。

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

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

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

请求2.6在2.7.9之前为python用户引入了此警告,只有股票SSL模块可用。

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

 pip install --upgrade ndg-httpsclient 

但是,在没有pyOpenSSL的构build依赖的系统上,这可能会失败。 在debian系统上,在上面的pip命令之前运行它应该足以让pyOpenSSL构build:

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

我不使用这个在生产中,只是一些testing跑步者。 并重申urllib3文档

如果你知道你在做什么,并想禁用这个和其他警告

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

编辑/更新:

以下也应该工作:

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

如果您无法将您的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

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

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

这里给出的所有解决scheme都没有帮助(我受限于Python 2.6.6)。 我已经find了答案在一个简单的开关传递给点:

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

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

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

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

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

我不得不先去ZSH(从ZSH)开始。 然后

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

解决了这个问题。

对于我没有工作,我需要升级点…

于Debian / Ubuntu

安装依赖关系

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

升级点和安装软件包

 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服务器上遇到了类似的问题,我在python2.7的早期版本的顶部安装了python 2.7.12,位于/ usr / local。 升级到CentOS 6或7现在不在这个服务器上。

一些python 2.7模块仍旧存在于较旧版本的python中,但是pip无法升级,因为CentOS 5软件包不支持较新的encryption软件包。

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

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

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

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

 2) pip install 'requests[security]' 

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

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

 yum install openssl-devel 

为了让密码学build立

下面是它在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)上做了一个apt-get dist-upgrade ,其中包括libssl1.1:amd64

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

为了解决这个错误,我所需要做的就是成为root(使用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 

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