我的程序包含两个我知道并信任的根证书。我必须验证信任中心的证书和信任中心颁发的"用户"证书,它们都来自这两个根证书。
我使用X509Chain类来验证,但只有当根证书在Windows证书存储中时才有效。
我正在寻找一种方法来验证证书,而不导入这些根证书-不知何故,告诉X509Chain类我确实信任这个根证书,它应该只检查链中的证书,而不检查其他任何东西。
实际代码:
X509Chain chain = new X509Chain();
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
chain.ChainPolicy.ExtraStore.Add(root); // i do trust this
chain.ChainPolicy.ExtraStore.Add(trust);
chain.Build(cert);
编辑:它是一个. NET 2.0 Winforms应用程序。
5条答案
按热度按时间z0qdvdin1#
我在dotnet/corefx上打开了一个Issue,他们回复如下:
如果AllowUnknownCertificateAuthority是唯一设置的标志,则
chain.Build()
将返回true,如果如果未指定该标志,则会添加附加约束:
因此,Build()返回true,您就知道存在一个时间有效的未撤销链。此时要做的事情是读取
chain.ChainElements[chain.ChainElements.Count - 1].Certificate
并确定它是否是您信任的证书。我建议将chainRoot.RawData
与byte[]
进行比较,byte[]
表示您在上下文中信任为根的证书(即,逐字节比较,而不是使用指纹值)。(If设置其它标志,则也放松其它约束)
所以你应该这样做:
wr98u20j2#
多年来,我们发现我在这里发布的原始X509Chain解决方案存在一些问题,因为X509Chain在某些边缘情况下执行不正确的行为。因此,我不能再推荐使用X509Chain来解决这个问题。我们的产品已经转移到使用Bouncy Castle来做我们所有的证书链验证,它已经经受住了我们所有的测试,并且总是按预期工作。
我们的新解决方案的基础可以在这里找到:Build certificate chain in BouncyCastle in C#
我已经删除了原来的答案,所以没有人使用一个坏的安全解决方案。
zqry0prt3#
获得此验证的方法是编写一个自定义验证。
如果您在WCF上下文中,则通过对
System.IdentityModel.Selectors.X509CertificateValidator
进行子类化并在web.config中的serviceBehavior对象上指定自定义验证来完成此操作:但是,如果您只是在寻找一种从另一台主机接受SSL证书的方法,则可以修改system.netweb.config文件中的www.example.com设置:
下面是一个X509 CertificateValidator的示例,它测试客户端证书是否存在于LocalMachine/Personal存储中。(这不是您需要的,但作为示例可能会很有用。
6ojccjat4#
如果您知道哪些证书可以是要检查的证书的根证书和中间证书,则可以在
X509Chain
对象的ChainPolicy.ExtraStore
集合中加载根证书和中间证书的公钥。我的任务还包括编写一个Windows窗体应用程序来安装证书,前提是证书的颁发依赖于我国政府的已知“国家根证书”。还有数量有限的CA被允许颁发证书来验证到国家Web服务的连接,因此,我只有一组有限的证书,这些证书可以在证书链中,但在目标计算机上可能会丢失。我在子目录“cert”中收集了CA的所有公钥和政府根证书申请的日期:
在Visual Studio中,我将目录证书添加到解决方案中,并将此目录中的所有文件标记为嵌入式资源。这允许我在我的c#库代码中枚举“受信任”证书的集合,以构建一个链来检查证书,即使没有安装颁发者证书。为此,我为X509Chain创建了一个 Package 类:
在调用函数中,我现在可以成功地检查未知证书是否派生自国家根证书:
要完成整个画面:为了检查根证书(通常会安装根证书,因为它包含在Windows Update中,但理论上也可能丢失),我将友好名称和指纹与发布的值进行比较:
我不确定此检查是否安全,但在我的示例中,Windows窗体应用程序的操作员非常确定有权访问要安装的有效证书。该软件的目标只是筛选证书列表,以帮助他在计算机的机器存储区中仅安装正确的证书(软件还安装中间证书和根证书的公钥,以确保Web服务客户端的运行时行为是正确的)。
92vpleto5#
我刚刚扩展了@Tristan的代码,检查根证书是否是添加到ExtraStore的证书之一。