Python SSL验证替代域
我打算通过TLS连接到远程主机example.com,但我必须通过DNS名称为example-proxy.com的代理IP地址进行连接 我无法控制SSL证书,也无法要求example.com上的管理员将example-proxy.com添加到其证书的SAN中 使用example-prxoy.com会导致错误,因为主机名与证书中的名称不匹配。如何将主机参数拆分为两个:(1)用于网络连接的域名和(2)用于证书验证的域名 我没有资源修改OpenSSL库,但我可以对Python库进行更改。根据,我本可以修改该方法来实现此功能,但在Python3.7+中不再可用 询问Python SSL验证替代域,python,security,ssl,openssl,tls1.3,Python,Security,Ssl,Openssl,Tls1.3,我打算通过TLS连接到远程主机example.com,但我必须通过DNS名称为example-proxy.com的代理IP地址进行连接 我无法控制SSL证书,也无法要求example.com上的管理员将example-proxy.com添加到其证书的SAN中 使用example-prxoy.com会导致错误,因为主机名与证书中的名称不匹配。如何将主机参数拆分为两个:(1)用于网络连接的域名和(2)用于证书验证的域名 我没有资源修改OpenSSL库,但我可以对Python库进行更改。根据,我本可以
只需为TCP连接和TLS握手提供不同的主机名,即在
wrap\u socket
中设置server\u主机名。要对此进行修改,请执行以下操作:
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握手中的SNI扩展和验证证书,这将使用tls\u主机名
。但基于您的问题,这似乎是您需要的:连接到IP:port,但使用特定主机名进行TLS握手和验证。最佳做法是创建自签名CA证书(从技术上讲,它们都是自签名的)然后使用该CA为example.com
签署证书,并将其安装在example proxy.com
上。然后您可以将CA安装到运行Python代码的计算机的信任存储中。此外,示例代理是L3 TCP/IP代理,它不干预TLS握手。我也没有网络管理员权限,也不能更改DNS记录。我明白了,是的,使用TCP代理你真的什么都做不了。您使用的是请求
还是普通的urllib
?看看是否有帮助。我直接使用ssl包中的SSLSocket。那么呢?谢谢!成功了。你看到这个配置可能会出现的任何安全漏洞吗?@约翰:主机名验证点是,证书与预期的主机名匹配,以防止中间人攻击中的主动人。这里的期望是明确的。这意味着不存在由此带来的安全问题。