使用C#,如何以编程方式确定是否已禁用Windows证书存储中的证书

时间:2017-06-02 21:06:59

标签: c# windows certificate pki x509certificate2

我目前正致力于使用HTTPS优化相互身份验证的客户端/服务器应用程序之间的通信。我目前正在将验证逻辑构建到C#客户端,以帮助在TLS连接失败时识别配置问题。在验证连接时,我验证服务器提供的根CA证书是安装在客户端上的适当存储中,并且是有效的。我使用X509Store提取X509Certificate2,然后使用X509Chain对其进行验证。

我的问题是,即使证书已通过MMC禁用,证书也会报告为有效。因此,尽管链报告有效,但TLS连接将失败。

Certificate Properties

这是一个不太可能发生的情况,但我想通过举报类似的问题来处理#34;无法连接因为根CA已被禁用。"

有没有人能指出我可以通过.NET或Win32调用来确定"证书目的"的价值。获得证书?或者阅读"证书状态"证书?

Certificate Status

我通过MSDN列出了System.Security.Cryptography命名空间中的内容,并开始查看CryptoAPI和CNG,但到目前为止还没有找到任何内容。

谢谢!

1 个答案:

答案 0 :(得分:0)

该对话框不会“禁用”它为所有目的禁用它的证书。这意味着它被视为具有空的增强型密钥用法扩展,用于EKU验证。

通常,根证书(或中间CA证书)不具有EKU扩展名,因此如果使用任何ApplicationPolicy值进行链构建,则它将是匹配项。将所有目的设置为“禁用”后,您将收到链错误X509ChainStatusFlags.NotValidForUsage

如果您想构建用于验证TLS的内容,您需要检查服务器身份验证或客户端身份验证EKU(取决于您正在检查的内容):

// Server EKU or Client EKU
Oid eku = forServer ? new Oid("1.3.6.1.5.5.7.3.1") : new Oid("1.3.6.1.5.5.7.3.2");

// Test if it's valid for that purpose
chain.ChainPolicy.ApplicationPolicy.Add(eku);

如果要完全“禁用”根CA,请将证书副本添加到“禁止使用”存储(在UI中称为“不受信任的证书”)。这将导致链构建产生X509ChainStatusFlags.ExplicitDistrust