Python 如何使“请求”使用与DNS解析不同的主机名进行TLS验证?

Python 如何使“请求”使用与DNS解析不同的主机名进行TLS验证?,python,networking,dns,python-requests,Python,Networking,Dns,Python Requests,有一个服务正在域中运行,例如vpc elasti xyz.us-east-1.es.amazonaws.com。它侦听常规HTTPS连接,并具有该域的有效证书 我需要一个Python应用程序,使用请求模块安全地连接到此服务,但要通过不同的主机名--我的搜索域.example.com 我想知道是否有这样的方法: s=Session() req=Request('GET','my search domain.example.com') prepped=s.prepare\U请求(req) # ???

有一个服务正在域中运行,例如
vpc elasti xyz.us-east-1.es.amazonaws.com
。它侦听常规HTTPS连接,并具有该域的有效证书

我需要一个Python应用程序,使用
请求
模块安全地连接到此服务,但要通过不同的主机名--
我的搜索域.example.com

我想知道是否有这样的方法:

s=Session()
req=Request('GET','my search domain.example.com')
prepped=s.prepare\U请求(req)
# ?????
prepped.expected_host_name='vpc elasti xyz.us-east-1.es.amazonaws.com'
resp=s.send(预处理)
我想到的可能解决方案:

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

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

    为了满足这一需要,有
    HostHeaderSSLAdapter
    。用法示例:


    我相信您可以在请求中手动设置主机。像
    req=Request('GET','my search domain.example.com',headers={“Host”:“vpc elasti xyz.us-east-1.es.amazonaws.com})
    @DusanBajic回答了我的问题!如果你能把它扩展成一个答案,我会把它标记为接受
    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"})