如何验证KeyUsage的证书

时间:2015-09-21 20:44:37

标签: c# .net x509certificate2

我正在尝试验证证书以确保它具有正确的keyUsage。 但是看不出我如何在这个应用程序策略中指定我的X509KeyUsageFlags.KeyEncypherment使用标志。

这是我到目前为止的代码。还有其他人让这个工作吗?

X509Certificate2 tmpCert = new X509Certificate2(Cert);

X509Chain ch = new X509Chain();
ch.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
ch.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;

var kUsage = new System.Security.Cryptography.Oid("2.5.29.15");                    
ch.ChainPolicy.ApplicationPolicy.Add(kUsage);

bool success = ch.Build(tmpCert);

2 个答案:

答案 0 :(得分:2)

certKeySign扩展名不是链的一部分,因为此扩展名没有约束。因此,您需要两个单独的程序

  1. 验证证书链
  2. 验证链中的单个证书是否符合其他要求。
  3. @Yacoub提供的代码缺少重要结果:当证书中未显示密钥用法扩展时。在这种情况下,假定密钥对所有用法都有效,除了所有类型的V3证书的cRLSignKeyUsage用法。在V1或V2证书的情况下,using System.Linq; using System.Security.Cryptography.X509Certificates; // there should go namespace and class definition ... // public bool KeyUsageHasUsage(X509Certificate2 cert, X509KeyUsageFlags flag) { if (cert.Version < 3) { return true; } List<X509KeyUsageExtension> extensions = cert.Extensions.OfType<X509KeyUsageExtension>().ToList(); if (!extensions.Any()) { return flag != X509KeyUsageFlags.CrlSign && flag != X509KeyUsageFlags.KeyCertSign; } return (extensions[0].KeyUsages & flag) > 0; } 扩展名的缺席字面意思是所有用法。

    我建议使用以下代码:

    {{1}}

    它被实现为一个通用函数来验证任意密钥使用标志。

答案 1 :(得分:0)

您可以在不进行密钥加密检查的情况下手动验证链。然后,您可以手动检查证书是否具有密钥加密用法。

使用以下代码检查密钥用法:

static public bool UsageHasKeyEncipherment(X509Certificate2 tmpCert)
{

    foreach (X509KeyUsageExtension usage_extension in tmpCert.Extensions.OfType<X509KeyUsageExtension>())
    {
        if ((usage_extension.KeyUsages & X509KeyUsageFlags.KeyEncipherment) == X509KeyUsageFlags.KeyEncipherment)
        {
            return true;
        }
    }

    return false;
}