ValueError:check_hostname 需要使用 Fiddler 4 的 server_hostname

Posted

技术标签:

【中文标题】ValueError:check_hostname 需要使用 Fiddler 4 的 server_hostname【英文标题】:ValueError: check_hostname requires server_hostname using Fiddler 4 【发布时间】:2021-06-27 21:02:25 【问题描述】:

最近发布的这个question 有一些有用的答案,但和我的不一样。我正在从 ArcGIS Pro Notebook 运行 urllib3 1.26.4 和 Python 3.7。我还打开了 Fiddler 4,因为我想在对脚本进行故障排除时跟踪 Web 流量。当我打开 Fiddler 时,我只会收到以下错误。如果我关闭 Fiddler,我会得到 <Response [200]>。在 Fiddler 打开的情况下不能使用requests 模块吗?我是 Fiddler 的新手。

截断的脚本:

import requests

#url
idph_data = 'https://idph.illinois.gov/DphpublicInformation/api/covidVaccine/getVaccineAdministrationCurrent'
#headers
headers = 'user-agent': 'Mozilla/5.0'

response = requests.get(idph_data, headers=headers, verify=True)

错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
In  [35]:
Line 4:     response = requests.get(idph_data,verify=True)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\api.py, in get:
Line 76:    return request('get', url, params=params, **kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\api.py, in request:
Line 61:    return session.request(method=method, url=url, **kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\sessions.py, in request:
Line 542:   resp = self.send(prep, **send_kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\sessions.py, in send:
Line 655:   r = adapter.send(request, **kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\adapters.py, in send:
Line 449:   timeout=timeout

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connectionpool.py, in urlopen:
Line 696:   self._prepare_proxy(conn)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connectionpool.py, in _prepare_proxy:
Line 964:   conn.connect()

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connection.py, in connect:
Line 359:   conn = self._connect_tls_proxy(hostname, conn)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connection.py, in _connect_tls_proxy:
Line 506:   ssl_context=ssl_context,

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\util\ssl_.py, in ssl_wrap_socket:
Line 432:   ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\util\ssl_.py, in _ssl_wrap_socket_impl:
Line 474:   return ssl_context.wrap_socket(sock)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\ssl.py, in wrap_socket:
Line 423:   session=session

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\ssl.py, in _create:
Line 827:   raise ValueError("check_hostname requires server_hostname")

ValueError: check_hostname requires server_hostname
---------------------------------------------------------------------------

【问题讨论】:

Arcgispro 似乎在文件 C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\ssl.py 中实现了自定义 SSL/TLS 证书验证。因此它不信任 Fiddler 使用的自定义根 CA 证书。 您找到解决方案了吗? 不直接,不。但是,我一直在尝试使用 Wireshark:wireshark.org,这不会导致该错误。 我安装了 FiddlerRoot 证书,但仍然出现错误。在 Fiddler 中:Tools-->Options...-->HTTPS-->Actions-->Export Root Certificate to Desktop-->Install Certificate. 【参考方案1】:

我已更新到requests v. 2.7.0,最新版本,我不再收到错误消息。如果它是与 v. 2.25.1 相关的版本特定问题,这是我正在使用的,我不确定。我没有发现任何证据。

在与我的 Python 可执行文件相同的目录中的 Windows 命令提示符中:

python -m pip install requests==2.7.0

现在,如果我使用 Fiddler 捕获运行我的原始脚本,我的 HTTP 状态为 200,并且我的脚本不再给我错误。

【讨论】:

【参考方案2】:

当前版本的 ArcGIS Pro 提供的环境也遇到了这个问题。根据您链接的问题中评分较低的答案,我在所需的环境中运行了pip install urllib3==1.25.11(在我的情况下是默认环境的克隆),问题似乎已经解决。

这显然是由于 ArcGIS Pro 提供的 urllib3 版本中的一项新功能。上面的命令降级到一个相对较新但工作的版本。这不会在较新版本的 urllib3 中得到解决,但目前有一个 pull request 待定以解决 Python 本身的潜在问题。

顺便说一句,虽然可以将pip配置为能够通过fiddler代理运行,但这并不容易,所以最好在运行任何pip命令时关闭Fiddler。

找到相关的错误报告here。问题似乎是CPython /内置urllib解析Windows系统代理设置的方式存在一个非常古老的错误,导致用于https URL的代理条目始终接收HTTPS前缀(而不是HTTP )。 urllib3 的较新版本实际上支持通过 HTTPS 使用代理,而以前并非如此。所以之前,urllib3 会忽略前缀,但现在,它会尝试使用 HTTPS 与 HTTP url 进行通信。

【讨论】:

你有这个错误的链接吗? 你给了我在 Anaconda 环境/Python 3.8 中运行我的脚本的想法。我在运行urllib v. 1.25.11 并运行 Fiddler 时这样做了。这次它捕获了它出现的流量。因此,这也为您的观察提供了一些信誉。我在等着看有没有其他人有任何见解。 我在其他地方看到这称为错误,但也没有参考。所以我可能会错误地将其称为错误,而实际上它只是 urllub3 的 API 中的一个更改,尚未通过某些依赖项解决。 @Pfalbaum 我相信这是相关的错误:bugs.python.org/issue42627 看起来有一个待处理的拉取请求(github.com/python/cpython/pull/26307),但不幸的是,修复似乎是在 CPython 中,所以不是必须像升级 urllib3 或请求一样容易修复。但是 urllib3 降级应该可以继续工作。

以上是关于ValueError:check_hostname 需要使用 Fiddler 4 的 server_hostname的主要内容,如果未能解决你的问题,请参考以下文章

Python ValueError: check_hostname requires server_hostname

Python 学习记录Pycharm导入第三方包报错问题……ValueError: check_hostname requires server_hostname

使用fiddler抓包工具时 Python requests 报错:ValueError: check_hostname requires server_hostname 之解决方案

Anaconda Navigator 启动 报错check_hostname requires server_hostname 全网解决方案汇总

pip安装(install)任何package(扩展库)都报错status = self.run(options, args)...check_hostname requires serve的解决方法

ValueError:未知标签类型