我正在努力解决SslStream AuthenticateAsServer明显缺乏灵活性的问题.我有一个自签名的rootCA,一个中间CA和一个终端实体(主机)证书.我只做服务器身份验证.客户端已经完成了rootCA证书,我试图想出一些方法将整个链从服务器发送到客户端,以便客户端可以验证服务器,我还可以比较信任的指纹锚定rootCA与客户端中包含的.
理想情况下,我希望避免使用证书存储并明确发送证书.如果有人知道如何做到这一点,它是我的问题的最佳解决方案.
但似乎SslStream AuthenticateAsServer不会以任何文档的方式让您明确指定要发送的链.您必须发送底层证书,然后将其余部分从证书库中挖掘出来.这不太理想,但它似乎是唯一的选择,所以我这样尝试.现在的问题是(使用受信任的根证书颁发机构中的自签名CA和服务器上的中间根证书颁发机构中的中间件),只有主机证书和中间证书正在"自动"发送到客户端.我只在客户端获得这两个证书,而不是rootCA证书.为什么?
有没有办法使用证书链验证AuthenticAsServer?
如果没有,它会在发送之前将根证书从链顶部切掉吗?
如果上面没有答案,那么至少有一种方法可以分流(自动)魔术,将剩下的链子从商店中挖出来,在那里我可以查看结果,而不必通过AuthenticateAsServer,到客户端CertValidationCallback?至少这样我会调试一个黑盒子,而不是一串黑盒子.
更新我4年前问过的这个问题。我从来没有找到任何方法来做上面描述的事情。SslStream 确实有一个如此严格的接口。有时我会将根证书放回链中(如果身份验证方是 xamarin?),大多数其他时候我不会,而且没有办法强制它以一种或另一种方式。所以我最终做了两件事来解决这个问题:
chain.ChainPolicy.ExtraStore,然后验证链是否构建。(chain.ChainElements[chain.ChainElements.Count - 1].Certificate.Thumbprint == rootCert.Thumbprint) ,这验证了添加真正的根证书后,实际用作构建链的根证书的证书确实是真正的根证书。这可以防止某人使用其他根证书并仅仅因为链构建而通过验证。因此,我们确保#1 添加了根证书的链可以被构建,#2 所构建的链包含我们的根证书。