如何验证X509证书?

11

我必须写一个工具,用于验证X509证书是否有效(输入为证书路径/主题和密码)。我该如何做呢?我对证书不是很了解...


一个X.509证书没有密码保护(通常它的对应私钥是)。如果您已经拥有认证路径,则大部分工作已经完成(如果您信任该证书路径所指向的信任锚点)。 - Bruno
@Bruno:正确的证书验证不仅仅是检查签名那么简单。还必须检查密钥用途、有效期限、路径限制等。然后必须检查吊销(使用OCSP和CRLs)。等等... - Eugene Mayevski 'Callback
3个回答

17

2
另外,如果您需要了解证书失败的详细信息,可以输出链:http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx - Oliver

1

一般来说,RFC 3280 包含了几乎完整的指令,关于如何执行验证,但这些指令非常复杂。此外,您需要阅读 RFC 2560(OCSP)并实现 OCSP 客户端。

对于大多数任务,您会发现我们的 TElX509CertificateValidator 组件 非常适合。它检查证书路径、CRL 和 OCSP 撤销(以及检查 CRL 和 OCSP 响应的有效性)。它足够灵活和强大,并允许您在每个步骤上执行额外的深入检查。此外,此组件可以与 Windows 证书存储和任何其他证书、证书链和存储一起使用,这些证书、证书链和存储可能存在于文件或内存中。


0

X509Certificate2.Verify 方法使用基本验证策略执行 X.509 链验证。

此方法为证书构建简单链,并对该链应用基本策略。如果您需要有关失败的更多信息,请使用 X509Chain 对象直接验证证书。

X509Certificate2 cert = GetX509Cert();
// Verify the certificate
bool isValid = cert.Verify();

但是有很多因素可以影响X.509证书的有效性,包括过期日期、签名者的身份和信任链。所以如果Verify对您来说不够,根据您的具体要求,您可能需要编写自定义代码进行验证。因此,您可以编写自己的验证代码:
public static bool ValidateCertificate(X509Certificate2 certificate)
{
    // Check the certificate has not expired
    if (certificate.NotAfter < DateTime.UtcNow)
    {
        return false;
    }

    // Performs a X.509 chain validation using basic validation policy
    if (!certificate.Verify())
    {
        return false;
    }

    // Check that the certificate's subject contains a specific string
    if (!certificate.Subject.Contains("CN=example.com"))
    {
        return false;
    }

    // Check that the certificate's issuer contains a specific string
    if (!certificate.Issuer.Contains("CN=Root CA"))
    {
        return false;
    }

    // All checks passed, certificate is valid
    return true;
}

您需要初始化 X509Certificate2类的新实例来验证它。有许多构造函数可通过以下方式之一创建新实例:

  • 证书文件路径
  • PEM 文件路径或 PEM 文件内容
  • 包含二进制(DER)编码或 Base64 编码 X.509 数据或 PKCS7(Authenticode)签名文件数据的字节数组
  • 非托管句柄
var cert = new X509Certificate2(@"C:\yourcertfile.crt");
// or
var cert = new X509Certificate2(@"C:\yourcertfile.crt", password); 
// or
var cert = new X509Certificate2(@"C:\yourcertfile.crt");
// or
var cert = X509Certificate2.CreateFromPemFile(@"C:\yourcertfile.pem");
// or
var cert = X509Certificate2.CreateFromPem(File.ReadAllText(@"C:\yourcertfile.pem"));

您还可以通过 X509Store按主题名称查找证书 打开当前用户或当前计算机的证书存储。

X509Store store = new X509Store("MY",StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Your Cert's Subject Name", false);
var cert = certs.Count > 0 ? certs[0] : null;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接