我正在尝试验证证书以确保它具有正确的 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);
KeyUsage
扩展不是链的一部分,因为对此扩展没有任何限制。因此,您需要两个单独的过程
- 验证证书链
- 验证链中的单个证书是否满足其他要求。
@Yacoub 提供的代码缺少一个重要的结果:当证书中未提供密钥用法扩展时。在这种情况下,假定密钥对所有用途都有效,除了certKeySign
and cRLSign
所有类型的 V3 证书的用途。如果是 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;
}
它被实现为通用函数来验证任意密钥使用标志。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)