【问题标题】:ssl connection, using a hostname that is not in the SAN list of the host's certificatessl 连接,使用不在主机证书的 SAN 列表中的主机名
【发布时间】:2022-04-22 15:18:06
【问题描述】:

我对 ssl 的东西很陌生,但恐怕我能猜到以下问题/问题的最终答案:

我们正在构建硬件(我们称它们为服务器),这些硬件将在其生命周期内进行 IP 地址修改。每个服务器都必须以安全的方式访问。我们计划使用 TLS 1.3 安全连接在服务器上执行一些操作(更新固件、更改配置等)。因此,我们需要为服务器提供一个证书(每个),以便他们可以声明自己的身份。 PKI 问题超出了这个问题的范围(我们假设),我们可以理所当然地认为客户端和服务器将共享一个共同的受信任 CA 以确保 SSL 握手正常。服务器将仅在已配置(可更改)的 IP 地址上提供 http 连接。循环中不涉及 DNS。

我们想知道如何正确设置服务器的证书。

由于IP会发生变化,因此不能作为服务器证书中的通用名称。

因此,我们正在考虑使用更持久的东西,例如序列号或 MAC 地址。

问题是,由于循环中没有 DNS,客户端无法向www.serialNumberOfServer.com 发出 http 请求,必须连接到http://x.y.z.t(这将经常更改(至少频繁到我们不会每次都颁发一个新服务器的证书))

如果我们做对了,ssl 握手要求主机名(在我们要连接的 URL 中)匹配服务器证书的 commonName 或其主题的备用名称 (SAN) 之一。正确的?在这里,它将是 x.y.z.t。 所以我们认为我们陷入了这样一种情况:服务器无法使用它的 IP 来证明自己的身份,而客户端想要专门使用它来连接服务器。

有什么解决办法吗?

我们错过了什么吗? 任何帮助将非常(非常)感激。不要犹豫,你应该需要更详细的解释!

不管怎样,开发环境将是使用 QNetworkAccessManager/QSSlstuffs 框架的 Qt。

【问题讨论】:

    标签: ssl certificate hostname


    【解决方案1】:

    如果您根本没有让客户端使用 DNS,那么您确实有问题。 正确 解决方案是使用 DNS 或静态主机名列表(/etc/hosts,例如在 unix* 上或在 windows 上的 hosts.txt)。这将使您可以适当地设置名称。

    如果您只能使用 IP 地址,另一种选择是将您的所有 IP 地址放入服务器可能使用的证书中。仅当您有合理的少量地址可以分配给它们时,这才是可行的。

    或者您可以在服务器上保留一个证书缓存,每个证书都有一个地址,并让网络服务器启动过程的一部分来选择正确的证书。需要更复杂的启动。

    编辑:最后,一些 SSL 堆栈(例如 openssl)让您决定是否应将每个特定的验证错误作为错误接受或忽略。这将让您覆盖客户端的错误。但是,如果您没有正确绑定远程证书,这很难正确实施并且很容易出现安全问题,这意味着您通过盲目接受任何旧证书来使自己受到中间人或其他攻击。我不记得 Qt 的 SSL 库是否为您提供了这种级别的灵活性(我不相信,但没有去查阅文档)。

    【讨论】:

    • 这就是我的怀疑。客户端是否有办法连接到 IP 并告诉客户端如果证书具有可能/将会不同的已声明公用名就可以了吗?
    • 是的,让我在上面再添加一条注释。但我怀疑你会喜欢它。
    • 好吧,这就是我害怕的。我们将尝试尝试使用 /etc/hosts 解决方案,我们的每一个手指都可以按预期工作。副作用是我们的客户端每次都必须连接到 www.serialNumberOfServer.com 并且与 IP 地址的映射将由 /etc/hosts 文件保存。这在客户端的设计与我们首先阐述的设计略有不同。只要 ssl 层尝试将 serialNumberOfServer.com 与服务器的 CN/SAN(而不是与 /etc/hosts 关联的 IP)匹配,它就可以工作。
    • 非常感谢您的时间和建议@wes
    【解决方案2】:

    9 个月后回到主题! 原来有一个简单的解决方案(至少使用 Qt 框架)

    Qt 的 QNetworkRequest::setPeerVerifyName 为我们完成了这项工作。它允许使用其 IP 连接到主机并在 SSL 握手期间验证给定的 CN

    请参阅下面的 Qt 文档摘录:

    void QNetworkRequest::setPeerVerifyName(const QString &peerName)
    Sets peerName as host name for the certificate validation, instead of the one used for the TCP connection.
    This function was introduced in Qt 5.13.
    See also peerVerifyName.
    

    刚刚测试成功

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2017-06-27
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多