urllib3 1.26与代理冲突问题解决
在使用 urllib3 的 1.26.0 以上版本时可能出现问题:
ValueError: check_hostname requires server_hostname
此问题可能出现在运行 conda 、pip 等任何需要 urllib3 的命令和程序中。
本文章将描述在不回退 urllib3 的版本的情况下如何解决此问题。
网上已有的解决方式
在中文互联网上有不少关于此问题的文章,但解决方式基本是关闭代理。但是我的电脑中有自己编写的开机时自动运行的 python 脚本,不希望每次开机手动关代理、运行再打开,所以不准备采用此方式。
在 stackoverflow 上也有关于此的问题。在 stackoverflow 中,不少人建议将 urllib3 的版本回退到 1.25.8 或 1.25.11 ,但是由于我安装的一些包依赖最新版本的 urllib3 ,conda 在 solving environment 时失败。
最后在知乎上看到了这篇文章,虽然解决的不是我遇到的问题,但是实际上解释了问题出现的原因:
以前
urllib3其实并不支持https代理,也就是说代理服务器的地址虽然大家配置的是https,但是一直都是悄无声息地就按照http连接的,刚好代理服务器确实也只支持http,所以皆大欢喜。现在
urllib3要支持https代理了,那么既然配置代理是https就尝试用https的方式去连接,但是由于代理服务器其实只支持http,所以没法处理请求,ssl握手阶段就出错了。注意,这里的
https是指代理服务器自己的,和我们要访问的目标网站无关。因为目标网站的协议和代理服务器的协议并不要求一样,所以只需要更改代理配置 ,将访问
https网站的代理服务器地址改为http即可。
问题解决
我们可以在环境变量中增加以下两项:

增加变量后问题即解决
urllib3 1.26与代理冲突问题解决
https://blog.caomingjun.com/fixing-conflict-between-urllib3-and-proxy/