无法为身份验证服务器指定证书链
本文关键字:证书链 服务器 身份验证 | 更新日期: 2023-09-27 18:34:25
我正在努力解决SslStream AuthenticateAsServer明显缺乏灵活性的问题。我有一个自签名根 CA、一个中间 CA 和一个最终实体(主机(证书。 我只做服务器身份验证。 客户端已经烘焙了rootCA证书,我正在尝试想出某种方法将整个链从服务器发送到客户端,以便客户端可以验证服务器,并且我还可以将信任锚rootCA的指纹与客户端中包含的指纹进行比较。
理想情况下,我想避免使用证书存储并显式发送证书。 如果有人知道如何做到这一点,那就是解决我问题的最佳方法。
但似乎 SslStream AuthenticateAsServer 不会以任何记录的方式让您显式指定要发送的链。 您只需发送底部证书,并让它从证书存储中挖掘其余部分。 这不太理想,但它似乎是唯一的选择,所以我正在尝试这样做。 现在的问题是(自签名 CA 位于受信任的根证书颁发机构中,中间证书位于服务器上的中间根证书颁发机构中(只有主机证书和中间证书被"自动"发送到客户端。 我只在客户端上获取这两个证书,而不是rootCA证书。 为什么?
有没有办法使用证书链对服务器进行身份验证?
如果没有,它会在发送之前将根证书从链的顶部切断是不是一回事?
如果上述问题没有答案,那么至少有一种方法可以将(自动(魔术分流到商店的其余部分,在那里我可以查看结果,而不必通过AuthenticateAsServer,到客户端CertValidationCallback? 至少这样我会调试一个黑盒,而不是几个黑匣子的字符串。
更新我在 4 年前问过的这个问题。 我从来没有找到任何方法来做上面描述的任何事情。 SslStream实际上只有这样一个刚性的接口。有时我会将根证书重新回到链中(如果身份验证方是 xamarin?(,大多数时候我不会,并且没有办法以一种或另一种方式强制它。 所以我最终做了两件事来解决这个问题:
- 由于客户端将根证书嵌入为资源,因此我在证书验证回调期间将其拉出并将其显式添加到
chain.ChainPolicy.ExtraStore
,然后验证链是否构建。 - 假设构建了链,然后我检查条件
(chain.ChainElements[chain.ChainElements.Count - 1].Certificate.Thumbprint == rootCert.Thumbprint)
这验证了在添加真正的根证书后,实际用作根证书来构建链的证书确实是真正的根证书。 这可以防止某人使用其他根证书,并且仅仅因为链构建而通过验证。
1 可以构建链,并且构建的链 #2 包括我们的根证书。