无法为AuthenticateAsServer指定证书链?

时间:2014-12-15 21:13:31

标签: c# ssl chain

我正在努力解决SslStream AuthenticateAsServer明显缺乏灵活性的问题。 我有一个自签名的rootCA,一个中间CA和一个终端实体(主机)证书。我只做服务器身份验证。客户端已经完成了rootCA证书,我试图想出一些方法将整个链从服务器发送到客户端,以便客户端可以验证服务器,我还可以比较信任的指纹锚定rootCA与客户端中包含的。

理想情况下,我希望避免使用证书存储区并明确发送证书。如果有人知道如何做到这一点,它是我的问题的最佳解决方案。

但似乎SslStream AuthenticateAsServer不会以任何文档方式让您明确指定要发送的链。您必须发送底层证书,然后将其余部分从证书库中挖掘出来。这不太理想,但它似乎是唯一的选择,所以我这样尝试。现在的问题是(使用受信任的根证书颁发机构中的自签名CA和服务器上的中间根证书颁发机构中的中间件),只有主机证书和中间证书正在“自动”发送到客户端。我只在客户端获得这两个证书,而不是rootCA证书。为什么呢?

有没有办法使用证书链验证AuthenticAsServer?

如果没有,它会在发送之前将根证书从链顶部切掉吗?

如果没有上述答案,至少有一种方法可以分流(自动)魔术,将其余的链条从商店中挖出来,在那里我可以查看结果,而不必去通过AuthenticateAsServer,到客户端CertValidationCallback?至少以这种方式,我将调试一个黑盒子,而不是一串黑盒子。

1 个答案:

答案 0 :(得分:0)

更新我4年前问过的这个问题。我从来没有找到任何方法可以做上面描述的事情。 SslStream实际上只是具有如此严格的接口。 有时,我会把根证书重新带回链中(如果身份验证方是xamarin?),大多数时候我不会,并且没有办法强制采用另一种方法。因此,我最终做了两件事来解决此问题:

  1. 由于客户端将根证书作为资源嵌入,因此我在证书验证回调中将其拔出并将其显式添加到chain.ChainPolicy.ExtraStore,然后验证链已建立。
  2. 假设链已建立,然后检查条件(chain.ChainElements[chain.ChainElements.Count - 1].Certificate.Thumbprint == rootCert.Thumbprint),这验证了在添加了真正的根证书之后,实际上用作构建链的根证书的证书确实是真正的根证书。这样可以防止某人使用其他一些根证书,并且仅由于链条建立而通过了验证。

因此,我们确保可以构建添加了根证书的#1,并且构建的构建的#2包含我们的根证书。