简答:
InsecurePlatformWarning 是由于您的 Python 和 urllib3 版本。
如果您不关心安全性,只需禁用警告:
export PYTHONWARNINGS="ignore:A true SSLContext object is not available"
您的Permission denied 错误看起来像是文件权限问题。您正在运行pip 或setuptools 的用户没有对/Library/Python/2.7/site-packages/south 的写访问权限。看起来您使用的是 Mac,因此您应该:
- 为 pip 使用
--user 标志,(推荐)
即:pip install --user foo-package
这会将软件包安装到:/Users/your-username-here/Library/Python/2.7/lib/python/site-packages/
注意: This is your "per user site-packages directory
- 使用
sudo 以root 身份安装:sudo pip install foo-package
- 将
/Library/Python/2.7/site-packages 的所有权更改为您的用户(不推荐):
sudo chown -R your-username-here:wheel /Library/Python/2.7/site-packages
长答案:
此警告在具有旧版 Python 的平台上发出,其中 urllib3 和 requests 无法控制或不支持确保与服务器安全连接所需的某些 SSL 选项。
受影响的版本
您可能会遇到这种情况:Python <= 2.7.9、urllib3 >= 1.11
urllib3 文档
urllib3 Documentation 对错误消息的解释如下:
1.11 版中的新功能。
某些 Python 平台(特别是 2.7.9 之前的 Python 版本)在其 ssl 模块中存在限制,从而限制了 urllib3 可以应用的配置。特别是,这可能会导致在功能更强大的平台上成功的 HTTPS 请求失败,并可能导致某些安全功能不可用。
如果您遇到此警告,强烈建议您升级到较新的 Python 版本,或者按照 OpenSSL / PyOpenSSL 部分中的说明使用 pyOpenSSL。
有关禁用警告的信息,请参阅禁用警告。
从历史上看,urllib3 从来没有真正安全过。 first heading in the urllib3 docs states this:
非常重要的事实:默认情况下,urllib3 不验证 HTTPS 请求。
造成这种情况的历史原因是我们依赖 httplib 进行一些 HTTP 协议实现,而 httplib 并没有开箱即用地验证请求。这不是一个很好的理由,但我们到了。
幸运的是,启用经过验证的 HTTPS 请求并不难,并且有几种方法可以做到。
解决方法
禁用警告
如果您只需要使警告静音,有几种方法。最简单的方法是在运行 python 代码之前设置 PYTHONWARNINGS 环境变量,如下所示:
export PYTHONWARNINGS="ignore:A true SSLContext object is not available"
这应该可以在 Python 2.7+ 中使用,您也可以将 -W 标志用于 Python 解释器。
您也可以在代码中Disable Warnings,或使用logging 模块:
# To disable all urllib3 warnings
import urllib3
urllib3.disable_warnings()
# To capture warnings to your own log with the logging module
logging.captureWarnings(True)
在旧版 Python 上安装 SNI 支持
urllib3 Documentation shows how to install SNI support:
如果需要在 Python 2.6 或 Python 2.7.0-2.7.8 上使用 SNI,则必须分别安装 PyOpenSSL、ndghttpsclient 和 pyasn1。此外,要使用 certifi,您必须单独安装它。如果您在安装 urllib3 时知道需要这些依赖项,您现在可以这样做:
pip install urllib3[secure]
注意如果您在 linux 上执行此操作,例如 Ubuntu 14.04,您将需要 PyOpenSSL 的额外系统依赖项。具体来说,PyOpenSSL 需要加密,这需要您安装:
build-essential
python-dev
libffi-dev
libssl-dev
软件包名称可能因您使用的 linux 发行版而异。
更详细的技术信息
GitHub user dstufft 更详细地解释了为什么旧版本的 Python 无法确保安全连接:
除非您拥有 Python 2.7.9+ 或 Python 3.2+ urllib3(通过请求),否则无法控制它需要的某些 SSL 选项以确保与服务器的安全连接。特别是:
- 在 Python 2.6 上,它根本无法设置密码,因此它依赖于平台默认设置。
- 它无法禁用 TLS 压缩。
- 它无法禁用 SSLv3,而无需明确固定到 TLSv1.0。
- 它不能(连同一个足够新的 OpenSSL 来支持它)告诉 OpenSSL 选择更短但仍然有效的证书链,这使得很难在不破坏信任根的情况下从信任根中删除弱 1024 位密钥许多其他有效的 TLS 连接。
- 它不支持 SNI,这会强制 pip 兼容存储库使用烧录整个 IP 地址来使用 TLS,虽然与安全性没有严格相关,但它可能是使用已验证 TLS 和未验证 TLS 的人之间的区别。