如何验证 KeyUsage 的证书
How do I verify Certificate for KeyUsage
我正在尝试验证证书以确保它具有正确的 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);
您可以在没有密钥加密检查的情况下手动验证链。然后,您可以手动检查证书是否有密钥加密用法。
使用以下代码检查密钥用法:
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;
}
KeyUsage
扩展不是链的一部分,因为此扩展没有任何限制。因此,您需要两个单独的过程
- 验证证书链
- 根据其他要求验证链中的单个证书。
@Yacoub 提供的代码缺少一个重要结果:证书中未提供密钥使用扩展。在这种情况下,假定密钥对所有用途都有效,但对所有类型的 V3 证书的 certKeySign
和 cRLSign
用途除外。对于V1或V2证书,没有KeyUsage
extension字面意思是所有用法。
我建议使用以下代码:
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;
}
它被实现为验证任意键使用标志的通用函数。
我正在尝试验证证书以确保它具有正确的 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);
您可以在没有密钥加密检查的情况下手动验证链。然后,您可以手动检查证书是否有密钥加密用法。
使用以下代码检查密钥用法:
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;
}
KeyUsage
扩展不是链的一部分,因为此扩展没有任何限制。因此,您需要两个单独的过程
- 验证证书链
- 根据其他要求验证链中的单个证书。
@Yacoub 提供的代码缺少一个重要结果:证书中未提供密钥使用扩展。在这种情况下,假定密钥对所有用途都有效,但对所有类型的 V3 证书的 certKeySign
和 cRLSign
用途除外。对于V1或V2证书,没有KeyUsage
extension字面意思是所有用法。
我建议使用以下代码:
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;
}
它被实现为验证任意键使用标志的通用函数。