服务器或客户端是否应该能够使用已知根 CA 来验证客户端/服务器证书 - 中间证书链?

服务器或客户端是否应该能够使用已知根 CA 来验证客户端/服务器证书 - 中间证书链?

我正在尝试测试以下设置:

RADIUS 服务器采用 EAP-TLS 协议,客户端和服务器均拥有以下证书:

客户
公钥:clientcert_intermediatecert_chain.pem
CA 证书:rootcert.pem

服务器
公钥:servercert_intermediatecert_chain.pem
CA 证书:rootcert.pem

客户端证书 ( clientcert.pem) 和服务器证书 ( servercert.pem) 均由同一个中间证书 ( ) 签名intermediatecert.pem,而该证书又由根证书 ( rootcert.pem) 签名。
这两条设置为公钥的链按如下方式组合在一起(通过 Shell 命令):
cat servercert.pem intermediatecert.pem > servercert_intermediatecert_chain.pem
cat clientcert.pem intermediatecert.pem > clientcert_intermediatecert_chain.pem

现在,客户端尝试连接到服务器。双方都发送公钥,并尝试使用rootcert.pem

我知道“正常”的方式是,公钥只是服务器或客户端证书。而 CA 证书将是 imcert-rootcert-chain,但我必须知道这是否也能起作用。

现在我的问题是:

  1. 公钥是由服务器/客户端证书和中间证书组成的链,这合法吗?
  2. 如果是这样,这是否适用于双方(服务器和客户端)?
  3. 如果服务器(如 FreeRADIUS)或客户端从对方收到这些链,它们是否应该能够使用根证书来验证这些链?

根据我的经验,FreeRADIUS 无法正确验证此类证书链。如果我没有记错的话,FreeRADIUS 使用 OpenSSL 库,并在上述情况下执行与以下命令相同的操作:

openssl verify -CAfile rootcert.pem clientcert_intermediatecert_chain.pem

我很确定这行不通。OpenSSL 无法使用根证书验证这样的链。尝试将信任链组合在一起时会失败。
这是正确的吗?

顺便说一句,FreeRADIUS 返回与验证命令相同的错误:error 20 at 0 depth: cannot find issuer certificate这意味着它无法将信任链放在一起。

答案1

  1. 是的,使用具有通用中介 CA 的链是可以的。
  2. 是的。
  3. 是的,确实如此。您需要发布来自 FreeRADIUS 的调试输出。说它返回“错误 20”是没有帮助的。这可能不是 FreeRADIUS 错误,而是来自 OpenSSL 的输出。

答案2

看来我的设置存在问题,客户端没有发送完整的客户端中间链,而只发送了客户端证书(使用 Wireshark 弄清楚了)。相反,radius 服务器发送服务器中间链,工作正常。

因此,回答我的问题:是的,此设置应双向有效

相关内容