【问题标题】:Why is `server_hostname` required for an SSL-wrapped socket?为什么 SSL 封装的套接字需要“server_hostname”?
【发布时间】:2022-01-25 10:16:23
【问题描述】:

我正在编写一些需要通过 TLS 连接与远程主机通信的 Python 代码。我设置了这样的 SSL 上下文:

ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
cxt.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

然后,我通过端口p 连接到域d,如下所示:

s = ctx.wrap_socket(socket.create_connection(d, p))

在意外的 EOF 上遇到了协议违规。解决方法是像这样创建套接字:

s = ctx.wrap_socket(socket.create_connection(d, p), server_hostname=d)

我对 TLS 几乎一无所知,这很令人困惑。为什么成功连接需要服务器主机名?

如果重要的话,我在端口p = 1965 上测试了到域d = 'drewdevault.com' 的连接;我正在写一个 Gemini 客户端。这在所有远程主机上都无法重现。

【问题讨论】:

    标签: python ssl


    【解决方案1】:

    server_hostname 参数将在 TLS 握手中用于为服务器提供预期的主机名。 TLS 中没有严格要求,但需要一台服务器具有不同域的多个证书但在相同的 IP 地址上。没有这些信息,服务器不知道向客户端提供哪个证书。

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 1970-01-01
      • 2015-04-02
      • 2021-09-15
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多