将 TLS 相互身份验证限制为特定的 TLS 证书

Restrict TLS mutual authentication to specific TLS certificates

我的网络中有一个 PKI 和一个 CA 颁发所有 x509 证书。 因此,在我的网络上,所有服务器和客户端都拥有来自我的 CA 的证书以及私钥存储在它们相应的密钥库中。每个服务器和客户端也有链文件中的 CA 证书,可用于在进行 TLS 相互身份验证时验证对等 x509 证书的信任链。一切都很好。 假设我现在在我的网络上有两个服务器和两个客户端,我想确保 Client_A 和 Server_A 使用他们的 x509 证书通过 TLS 相互身份验证成功,因为 Client_B 和 Server_B 应该做。 同时,我想确保 Client_A 和 Server_B 之间的 TLS 相互认证不会成功。 (在 Client_B 和 Server_A 之间也有效)。

如何让我网络中的服务器和客户端不仅验证信任链,而且遵守某种白名单?

也许这在 TLS 层上不可行,这就是我想澄清的。

没有任何方法(据我所知)可以在 TLS 层执行此操作。

大多数 TLS 库在证书交换期间提供回调选项,这将是根据列表检查证书的合适位置。返回特定于库的版本 failure/unacceptable 通常会导致 TLS 握手失败,并且不会传输任何数据。

您可以使用以下两种方法中的任何一种来实现此目的-

  1. 在 TLS 层验证客户端证书:为每个客户端组创建单独的中间颁发 CA。例如,对于 Server_A 的所有客户端,创建一个名为 Ca_Client_A 的 CA。所以你的链看起来像 rootCA -> Ca_Client_A -> 客户端证书。将此 Ca_Client_A 导入服务器 A 的信任库中。现在 Server_A 将允许连接到发出 ca Ca_Client_A 的客户端。同样,您可以创建 Ca_Client_B 中间 CA,用于服务器 B 为客户组 B 提供服务。

  2. 在应用层验证客户端证书:为此,您需要在您的应用服务器中编写身份验证逻辑,您需要在其中放置限制条件,例如允许的客户端certificate-序列号或CN名匹配认证成功的关键字

希望对您有所帮助。

这在很大程度上取决于您使用的服务器软件,而不是 TLS 标准本身。某些软件包可以配置为信任由特定 CA 证书颁发的证书。在您的场景中,这将允许您的 CA 颁发的任何证书连接到配置为信任您的 CA 证书的任何服务器。其他服务器软件可以配置为信任特定证书或具有给定主题的证书(证书的可分辨名称、subjectAltName 等)因此,这取决于您尝试连接的特定 "server"。这是 Apache Web 服务器吗?信息系统? Tomcat?答案因我们谈论的服务器平台而异。