Python SSL验证替代域



我打算通过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+开始,它就不再可用了

询问

  1. 如何使用Python 3.7+同时指定主机名和证书名
  2. 从安全角度来看,我的实现怎么会出错

只需为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握手和验证。

相关内容

  • 没有找到相关文章

最新更新