我正在尝试测试以下设置:
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,但我必须知道这是否也能起作用。
现在我的问题是:
- 公钥是由服务器/客户端证书和中间证书组成的链,这合法吗?
- 如果是这样,这是否适用于双方(服务器和客户端)?
- 如果服务器(如 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
- 是的,使用具有通用中介 CA 的链是可以的。
- 是的。
- 是的,确实如此。您需要发布来自 FreeRADIUS 的调试输出。说它返回“错误 20”是没有帮助的。这可能不是 FreeRADIUS 错误,而是来自 OpenSSL 的输出。
答案2
看来我的设置存在问题,客户端没有发送完整的客户端中间链,而只发送了客户端证书(使用 Wireshark 弄清楚了)。相反,radius 服务器发送服务器中间链,工作正常。
因此,回答我的问题:是的,此设置应双向有效。