【发布时间】:2021-08-09 06:23:28
【问题描述】:
我打算通过 TLS 连接到远程主机 example.com,但我必须通过 DNS 名称为 example-proxy.com 的代理 IP 地址连接。
我无法控制 SSL 证书,也无法要求 example.com 的管理员将 example-proxy.com 添加到其证书的 SAN。
使用 example-prxoy.com 会导致 OpenSSL to error out,因为主机名与证书中的名称不匹配。如何将主机参数拆分为两个:(1)用于网络连接的域名和(2)用于证书验证的域名。
我没有资源来修改 OpenSSL 库,但我可以更改 Python 库。根据this doc,我本可以修改match_hostname 方法来实现此功能,但从Python 3.7+ 起不再可用。
询问
- 如何使用 Python 3.7+ 来指定主机名和证书名?
- 从安全的角度来看,我的实施怎么会出错?
【问题讨论】:
-
最佳实践是创建一个自签名 CA 证书(从技术上讲,它们都是自签名的)并使用该 CA 为
example.com签署证书并将其安装在example-proxy.com上。然后您可以将 CA 安装到运行 Python 代码的计算机的信任库中。 -
我应该补充一点,我也无权访问 example-proxy.com。此外,example-proxy 是一个 L3 TCP/IP 代理,它不干预 TLS 握手。我也没有网络管理员访问权限,也无法更改 DNS 记录。
-
我明白了,是的,使用 TCP 代理你真的什么都做不了。您使用的是
requests还是普通的urllib?看看this answer 是否有帮助。 -
我直接使用ssl包中的SSLSocket。
标签: python security ssl openssl tls1.3