SSL 连接,使用不在主机证书的 SAN 列表中的主机名



我对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/QSSLstuds框架的Qt。

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

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

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

编辑:最后,一些SSL堆栈(例如openssl(可以让您决定是否将每个特定的验证错误视为错误,或者可以忽略它。这将允许您覆盖客户端上的错误。然而,这很难正确实现,而且很容易出现安全问题。如果你没有正确绑定远程证书,这意味着你盲目接受任何旧证书,会受到中间人或其他攻击。我不记得Qt的SSL库是否给了你这样的灵活性(我不这么认为,但没有去查阅文档(。

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.

刚刚测试呈阳性

最新更新