我正在尝试测试以下设置:
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链,但我必须知道这是否也有效。
现在我的问题是:
根据我的经验,FreeRADIUS不验证这样的证书链权利。如果我没有弄错,FreeRADIUS使用OpenSSL库并在上面所示的情况下执行与以下命令相同的操作:
openssl verify -CAfile rootcert.pem clientcert_intermediatecert_chain.pem
我很确定这不管用。OpenSSL无法用根证书验证这样的链。当试图把信任链放在一起时,它失败了。
这是正确的吗?
顺便说一下,FreeRADIUS返回与error 20 at 0 depth: cannot find issuer certificate
命令相同的错误,这意味着它不能将信任链放在一起。
发布于 2017-07-08 05:46:34
还没有一个完整的答案,但是:
是的,由像OpenSSL这样的程序调用的FreeRADIUS库(直接调用或在这里通过libssl调用)可以验证接收到的链;不,命令行openssl verify
不验证链。这是在https://stackoverflow.com/questions/44375300/openssl-verify-with-chained-ca-and-chained-cert (我的)中讨论的,但这是被否决的和建议的主题之外的,所以我将在这里复制相关的部分:
openssl
命令行verify
只从作为操作数提供的文件读取一个证书,第一个证书,如果给出多个证书,则从每个文件读取证书。这与使用-CAfile -trusted -untrusted
选项指定的文件不同,这些选项可以(而且通常包含)包含多个证书。
您的文件clientcert_intermediatecert_chain.pem
按该顺序包含客户端证书和中间证书。只使用客户端证书,忽略中间证书,因此您没有可验证的有效链。
若要使用命令行来模拟/测试接收方(对于客户端证书链,服务器)所做的验证,可以使用-untrusted
将叶证书作为操作数提供给所有其他传输(链)证书(这里是一个中间证书),并将锚(S)和信任存储中的任何“已知”中间层提供显式或默认(您的-CAfile root
很好,尽管有其他有效的方法)。
关于FreeRADIUS的真正问题(Y):您确定客户端正在发送链吗?你有线索吗?
作为另一种选择:如果客户端(或一般对等方)没有发送所需的链证书,但它们位于本地信任库中,这可以说是一种虚假的操作,OpenSSL将使用这些证书。您可以尝试至少暂时地将中间证书添加到用于CA_file
的文件或用于CA_path
的已存储目录中。
发布于 2017-08-02 09:58:58
似乎我的设置的问题是,客户端没有发送完整的客户端中间链,而是只发送客户端证书(使用Wireshark计算出)。反过来,radius服务器发送服务器-中间链,工作良好。
因此,要回答我的问题:是的,这个设置应该在两个方向都能工作。
https://security.stackexchange.com/questions/163577
复制相似问题