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

2024-09-30 22:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个服务在一个域中运行,比如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. 使用指向vpc-elasti-xyz.us-east-1.es.amazonaws.commy-search-domain.example.com的CNAME记录。因为域名不匹配,所以OOB不起作用,但是一个解决方法是在我的代码中从DNS检索域名并直接使用它连接。这就是我现在所拥有的,它的工作,但我不想做的“手动DNS查询”如果可能的话。而且,在这一点上,DNS只是一个方便的数据存储——与配置文件或其他任何东西没有区别

Tags: comsearchesdnsexamplemydomainvpc
1条回答
网友
1楼 · 发布于 2024-09-30 22:25:27

默认情况下,请求支持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

相关问题 更多 >