我打算通过TLS连接到远程主机example.com,但我必须通过DNS名称为example-proxy.com的代理IP地址进行连接。
我无法控制SSL证书,也无法要求example.com的管理员将example-proxy.com添加到其证书的SAN中。
使用example-prxoy.com会导致OpenSSL出错,因为主机名与证书中的名称不匹配。如何将主机参数一分为二:(1(网络连接的域名和(2(证书验证的域名。
我没有修改OpenSSL库的资源,但我可以对Python库进行更改。根据这个文档,我本可以修改match_hostname方法来实现这个功能,但从Python 3.7+开始,它就不再可用了
询问
- 如何使用Python 3.7+同时指定主机名和证书名
- 从安全角度来看,我的实现怎么会出错
只需为TCP连接和TLS握手提供不同的主机名,即在wrap_socket
中设置server_hostname
。修改官方文档中的示例:
import socket
import ssl
tls_hostname = 'www.example.com'
context = ssl.create_default_context()
with socket.create_connection(('127.0.0.1',8443)) as sock:
with context.wrap_socket(sock, server_hostname=tls_hostname) as ssock:
print(ssock.version())
这将连接到('127.0.0.1',8443)
,但与www.example.com
进行TLS握手。请注意,这将使用tls_hostname
来进行TLS握手中的SNI扩展和验证证书。但根据您的问题,这似乎是您所需要的:连接到IP:port,但使用特定主机名进行TLS握手和验证。