开启Fiddler后Python requests请求失败 pip报check_hostname错误解决方法
报错原因
启动Fiddler后工具会自动修改系统全局代理规则,Python生态的requests、pip底层依赖urllib3库发起HTTPS请求时,在代理转发场景下未正确传递目标服务的server_hostname参数做SSL域名校验,就会触发ValueError: check_hostname requires server_hostname报错,该问题常见于Python 3.7+版本搭配旧版urllib3、或Fiddler开启HTTPS流量解密但未做兼容配置的场景。
解决方法
按实际使用场景选对应方案即可:
- 不需要抓Python相关流量时,临时关闭Fiddler HTTPS解密
打开Fiddler顶部菜单栏Tools->Options->HTTPS,取消勾选Decrypt HTTPS traffic,保存配置后重启Fiddler,该操作不影响HTTP流量抓包,也不会触发Python侧的SSL校验错误。 - 修复urllib3兼容bug
旧版本urllib3存在代理场景下的hostname参数传递缺陷,先临时关闭Fiddler,或执行命令绕过代理升级urllib3:
升级完成后重新开启Fiddler,绝大多数场景下requests、pip可正常走代理访问网络,不会再抛出该错误。pip install --upgrade urllib3 --no-proxy - 需要抓取Python HTTPS流量时的完整配置
如果需要用Fiddler解密Python发起的HTTPS请求,除升级urllib3外,还要把Fiddler根证书加入Python信任链:- 进入Fiddler的
Tools->Options->HTTPS页,点击Actions->Export Root Certificate to Desktop,将根证书FiddlerRoot.cer导出到桌面 - 安装certifi库拿到Python默认的证书存储路径:
import certifi print(certifi.where()) - 用文本编辑器打开上一步输出的
cacert.pem文件,把FiddlerRoot.cer的证书内容追加到文件末尾保存即可。
- 进入Fiddler的
- 临时绕过方法(仅本地调试使用,禁止生产环境使用)
不需要走Fiddler代理时,可以直接在执行命令或写代码时跳过系统代理:- pip执行时加
--no-proxy参数绕过代理:pip install 目标包名 --no-proxy - requests请求时显式指定不走代理、临时关闭校验:
import requests requests.get("目标URL", proxies={"http": None, "https": None}, verify=False)
- pip执行时加
- 不需要Fiddler抓全局流量时,关闭自动代理配置
进入Fiddler的Tools->Options->Connections页,取消勾选Act as system proxy on startup,保存后重启Fiddler,工具就不会自动修改系统全局代理,Python请求会直连网络,不会触发报错。
内容的提问来源于stack exchange,提问作者kshnkvn
相关产品推荐
相关产品推荐

