使用请求包时发生SSL InsecurePlatform错误


237

我正在使用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并禁用警告或提供证书。

Answers:


390

使用有些隐藏的安全功能:

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

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

  • pyOpenSSL
  • 密码学
  • 艾德娜

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

如果pip install失败并显示错误,请检查您是否具有必需的开发包libffilibssl使用发行版的包管理器将其python安装在系统中:

  • 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自己受到InsecurePlatformWarningPyPI的影响并且无法从PyPI安装任何东西,则可以通过此分步指南进行修复,以手动部署其他python软件包。


3
我有请求[安全],新终端,Python 2.7.3,但仍然收到此错误
Josh Nankin

45
您还需要在系统上为Ubuntu / Debian安装其他库:sudo apt-get install python-dev libffi-dev libssl-dev
therealmarv 2015年

2
“ pip”本身(从v6.1开始)是否可以发出相同的安全警告,可以吗?
jmster

5
这取决于你的shell,你可能需要键入pip install 'requests[security]'
C.里德

5
在zshell中,您需要说:pip安装请求\ [安全性]
阿米尔·卡茨

68

在2.6版之前,Requests 2.6针对python的用户引入了此警告,仅提供了可用的SSL模块。

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

pip install --upgrade ndg-httpsclient 

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

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

4
我还需要为ubuntu 14.04安装这些软件包'python-dev libffi-dev libssl-dev'。
安迪

谢谢!我在文档中添加了注释:github.com/shazow/urllib3/pull/765
Wolfgang,

@杰西卡FTW!非常感谢-这很烦人。
Neal Magee

18

我不会在生产中使用它,只是一些测试跑步者。并重申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)

1
该解决方案的问题在于,它只是抑制并忽略了实际问题。此外,使用pip安装或升级软件包时,此功能将无效。
杰森·帕拉姆

1
唯一适用于ubuntu 1404 / Python 2.7.6的解决方案。感谢
Ignacio Vazquez

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


8
请注意,2.5.3在重定向期间处理cookie时存在安全问题。
2015年

2
您应该已将另一篇文章标记为重复,而不是两次张贴此答案。我现在已经将其关闭。
马丁·皮特斯

6
由于存在已知漏洞,我第二次评论不降级
sergiopereira 2015年

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

2
非常小心,这样做,不验证证书可能是危险的!
jaapz 2015年

当然,不验证证书将很危险。但是有时候,这是不得已的方法。例如:easy_install,apt-get,yum或pip ...不要运行,或者做一些Web爬虫...
zzzz zzzz 2015年

1
我在共享的托管环境中,因此无法将python升级到2.7.9,也无法使用apt-get安装libffi.pc,这是pip install request [security]和其他pip install变体所必需的以上。所以这个答案对我有用。只要您了解重要的警告,即不通过https验证就可以更改/欺骗页面内容,我认为这个答案很好。
Chirael 2015年

5

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

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

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

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


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


我最终可以使用此命令安装tensorflow,非常感谢!
pedrobisp

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


谢谢你 没有其他答案对我有用。我很惊讶,这样的冗长烦人的消息将默认加入。

1

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

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

解决了问题。


我不确定。我认为这是由于括号所致
Martin Thoma

1

过去的一周来了,我在Ubuntu 14.04(与Python 2.7.6),我做了之后apt-get dist-upgrade,包括libssl1.1:amd64deb.sury.org

由于我是certbot-auto renew来自Cron作业,因此我也使用--no-self-upgrade来减少计划外的维护。这似乎是麻烦的根源。

要解决该错误,我所需要做的就是成为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再次正常运行。


我在这里描述了同样的问题。警告:/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:122:InsecurePlatformWarning:真正的SSLContext对象不可用。这会阻止urllib3正确配置SSL,并可能导致某些SSL连接失败。您可以升级到较新版本的Python来解决此问题。有关更多信息,请参见urllib3.readthedocs.io/en/latest/…。InsecurePlatformWarning我只键入命令:sudo apt-get dist-upgrade错误已修复。
Didierh

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

0

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

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

具体来说,“ pip安装请求[安全]”失败了,因为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一起使用。cryptograpy 1.3.4也足以满足以下命令的要求。

2) pip install 'requests[security]'

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

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

yum install openssl-devel

允许建立密码


0

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

import requests
import urllib3

# Suppress InsecureRequestWarning: Unverified HTTPS
urllib3.disable_warnings()


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

但是,您必须知道,这可能会导致潜在的安全风险


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.