【问题标题】:How do I verify Certificate for KeyUsage如何验证 KeyUsage 的证书
【发布时间】:2015-12-18 16:27:53
【问题描述】:

我正在尝试验证证书以确保它具有正确的 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);

【问题讨论】:

  • 嗯,查看 Mono 源代码,看起来这个 oid 只会检查证书签名使用情况。没有看到我们可以在哪些地方添加特定的 keyusage 标志。

标签: c# .net x509certificate2


【解决方案1】:

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

使用以下代码检查密钥使用情况:

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;
}

【讨论】:

    【解决方案2】:

    KeyUsage 扩展不是链的一部分,因为此扩展没有任何限制。因此,您需要两个单独的过程

    1. 验证证书链
    2. 验证链中的单个证书是否满足其他要求。

    @Yacoub 提供的代码缺少一个重要的结果:当证书中没有提供密钥使用扩展时。在这种情况下,假定密钥对所有用途都有效,但所有类型的 V3 证书的 certKeySigncRLSign 用途除外。在 V1 或 V2 证书的情况下,没有KeyUsage 扩展名的字面意思是所有用法。

    我会提出以下代码:

    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;
    }
    

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

    【讨论】:

    • 根据您提供的信息:如果版本小于 3,您总是返回 true。即使版本小于 3,您不应该先检查是否有密钥使用扩展并使用它有的话?
    • 仅在 X.509v3 证书中引入的证书扩展。版本 1 和版本 2 是无扩展证书,因此无需检查非 v3 证书中的任何扩展。
    • 嘿@Crypt32,我正在调查与此相关的问题。您是否有关于不存在 KeyUsage 扩展的情况的参考(当然是在 V3 中)?我已经查看了 rfc5280,如果不存在扩展名,我找不到关于如何解释密钥用法的描述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2015-08-17
    • 2011-04-06
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多