urllib3 1.26与代理冲突问题解决

在使用 urllib31.26.0 以上版本时可能出现问题:

ValueError: check_hostname requires server_hostname

此问题可能出现在运行 condapip 等任何需要 urllib3 的命令和程序中。

本文章将描述在不回退 urllib3 的版本的情况下如何解决此问题。

环境

  • windows 10
  • python 3.8.8
  • urllib3 1.26.4

网上已有的解决方式

在中文互联网上有不少关于此问题的文章,但解决方式基本是关闭代理。但是我的电脑中有自己编写的开机时自动运行的 python 脚本,不希望每次开机手动关代理、运行再打开,所以不准备采用此方式。

在 stackoverflow 上也有关于此的问题。在 stackoverflow 中,不少人建议将 urllib3 的版本回退到 1.25.81.25.11 ,但是由于我安装的一些包依赖最新版本的 urllib3condasolving environment 时失败。

最后在知乎上看到了这篇文章,虽然解决的不是我遇到的问题,但是实际上解释了问题出现的原因:

以前 urllib3 其实并不支持 https 代理,也就是说代理服务器的地址虽然大家配置的是 https,但是一直都是悄无声息地就按照 http 连接的,刚好代理服务器确实也只支持 http,所以皆大欢喜。

现在 urllib3 要支持 https 代理了,那么既然配置代理是 https 就尝试用 https 的方式去连接,但是由于代理服务器其实只支持 http,所以没法处理请求,ssl 握手阶段就出错了。

注意,这里的 https 是指代理服务器自己的,和我们要访问的目标网站无关。

因为目标网站的协议和代理服务器的协议并不要求一样,所以只需要更改代理配置 ,将访问 https 网站的代理服务器地址改为 http 即可。

问题解决

我们可以在环境变量中增加以下两项:

注意

  • HTTPS_PROXY 使用的协议是 http 而不是 https
  • 将环境变量的值更改为你自己的代理地址

增加变量后问题即解决

作者

Cao Mingjun

发布于

2021-09-28

更新于

2021-09-28

许可协议

评论