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

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只是一个方便的数据存储-与配置文件或其他任何内容都没有区别。
pwlsiynice 回答:如何使“请求”使用与DNS解析不同的主机名进行TLS验证?

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

本文链接:https://www.f2er.com/3169195.html

大家都在问