有一个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 Layer上是不可行的,这是我想澄清的。
答案 0 :(得分:2)
您可以使用以下任何一种方法实现此目的 -
在TLS层验证客户端证书:为每个客户端组创建单独的中间颁发CA.例如,对于Server_A的所有客户端,请创建名为Ca_Client_A的CA.所以你的链看起来像rootCA - > Ca_Client_A - >客户证书。在服务器A的信任库中导入此Ca_Client_A。现在,Server_A将允许连接到已发布ca Ca_Client_A的客户端。同样,您可以通过服务器B创建Ca_Client_B中间CA以便为客户端组B提供服务。
在应用层验证客户端证书:为此,您需要在应用服务器中编写身份验证逻辑,您需要在其中放置约束,例如允许的客户端证书序列号或CN名称与关键字匹配以进行成功验证。
希望有所帮助。
答案 1 :(得分:1)
在TLS层没有任何方式(我知道)。
大多数TLS库在证书交换期间提供回调选项,这是根据列表检查证书的适当位置。返回特定于库的故障/不可接受的版本通常会导致TLS握手失败,并且不会传输任何数据。
答案 2 :(得分:0)
这很大程度上取决于您使用的服务器软件,而不是TLS标准本身。某些软件包可以配置为信任由特定CA证书颁发的证书。在您的方案中,这将允许您的CA颁发的任何证书连接到配置为信任您的CA证书的任何服务器。其他服务器软件可以配置为信任特定证书,或具有给定主题的证书(证书的可分辨名称,subjectAltName等)。因此,它取决于您尝试连接的特定“服务器”。这是一个Apache Web服务器吗? IIS? Tomcat的?答案取决于我们正在谈论的服务器平台。