gpt4 book ai didi

python - 如何使 `requests` 使用与 DNS 解析不同的主机名进行 TLS 验证?

转载 作者:行者123 更新时间:2023-12-01 06:59:44 25 4
gpt4 key购买 nike

有一个服务在 vpc-elasti-xyz.us-east-1.es.amazonaws.com 等域中运行。它监听常规 HTTPS 连接并拥有该域的有效证书。

我需要一个使用 requests 模块安全连接到此服务的 Python 应用,但通过不同的主机名 - my-search-domain.example.com示例。

我想知道是否有办法做这样的事情:

s = Session()
req = Request('GET', 'my-search-domain.example.com')
prepped = s.prepare_request(req)

# ?????
prepped.expected_host_name = 'vpc-elasti-xyz.us-east-1.es.amazonaws.com'

resp = s.send(prepped)

我想到的可能的解决方案:

  1. 将该主机名添加到原始服务的证书中 - 遗憾的是不可能。
  2. 在服务前面放置一个反向代理并执行 TSL 终止——可行,但如果可能的话,我希望避免额外的移动部分。
  3. 使用 my-search-domain.example.com 的 CNAME 记录指向 vpc-elasti-xyz.us-east-1.es.amazonaws.com。这在 OOB 中不起作用,因为域名不匹配,但解决方法是在我的代码中从 DNS 检索域名,然后使用它直接连接。这就是我现在所拥有的并且它可以工作,但如果可能的话我不想执行“手动 DNS 查询”。另外,此时 DNS 只是一个方便的数据存储 - 与配置文件或其他任何东西没有什么不同。

最佳答案

Requests 默认支持 SSL 验证。但是,它依赖于用户使用包含主机名的 URL 发出请求。但是,如果用户需要使用 IP 地址发出请求,他们实际上无法根据他们想要请求的主机名验证证书。

为了满足这种需求,出现了HostHeaderSSLAdapter。用法示例:

import requests
from requests_toolbelt.adapters import host_header_ssl
s = requests.Session()
s.mount('https://', host_header_ssl.HostHeaderSSLAdapter())
s.get("https://my-search-domain.example.com", headers={"Host": "vpc-elasti-xyz.us-east-1.es.amazonaws.com"})

https://toolbelt.readthedocs.io/en/latest/adapters.html#hostheaderssladapter

关于python - 如何使 `requests` 使用与 DNS 解析不同的主机名进行 TLS 验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58686962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com