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/