如何在.NET中获取证书的“目的”(客户端身份验证证书)?

时间:2010-09-22 08:11:44

标签: .net authentication ssl certificate client-certificates

我想查找X509Store(StoreLocation.CurrentUser)

中的所有客户端身份验证证书

有没有这样做?即使通过某个属性进行所有过滤来获取所有客户端身份验证证书?

2 个答案:

答案 0 :(得分:2)

有一些扩展可帮助识别可用作客户证书的内容:

  • Extended Key Usage extensionid-kp-clientAuth如果存在。
  • “遗留”Netscape Cert Type扩展(不是严格标准,但广泛采用,甚至在Netscape / Mozilla工具的世界之外)。

根本没有这些扩展名的证书也可以用作客户证书,前提是它与(non-extended) Key Usage extension(如果存在)兼容。对于客户端证书,至少在(非扩展)密钥用法扩展中需要的是digitalSignature。如果您同时获得Netscape Cert Type和Extended Key Usage扩展,会发生什么情况并不是很清楚,但是,根据RFC 5280的精神,将其用于与所有扩展相兼容的用途是值得的:

  

如果证书包含密钥   使用扩展和扩展密钥   用法扩展,然后是两个扩展   必须独立处理   证书必须只用于   与两者一致的目的   扩展。如果没有目的   与两个扩展一致,   那么证书绝对不能使用   出于任何目的。

NSS Technical Note 3 (All About Certificate Extensions)应该是有意义的。

答案 1 :(得分:1)

您需要检查每个证书的Extensions。据我所知,一旦你进入Key Usage扩展,你应该拥有你需要的所有信息。

编辑实际上,对于客户端身份验证,您可能需要增强型密钥用法扩展。我没有附带的客户端身份验证证书来测试它,但下面打印了“服务器身份验证”,我已经获得了服务器证书:

        var cert1 = new X509Certificate2(/* Path to certificate */);
        foreach (var ext in cert1.Extensions)
        {
            var eku = ext as X509EnhancedKeyUsageExtension;
            if (eku != null)
            {
                foreach (var oid in eku.EnhancedKeyUsages)
                {
                    Console.WriteLine(oid.FriendlyName);
                }
            }
        }