如何完全验证X509证书?

问题描述 投票:0回答:1

我需要使用与证书进行通信之前相同的方法来验证证书(X509Certificate2)。

在这种情况下,当未将证书颁发给安装它的服务器时,X509Certificate2.Verify()将返回true。

是否有完成的代码块可以对X509证书进行完全验证?

问候

编辑:这是我尝试过的代码:

var certificate = GetServerCertificate(CertificateStore,CertificateLocation,Thumbprint);

            if(certificate != null)
            {
                if(certificate.Verify())
                    _logger.Log(NLog.LogLevel.Info, $"Yes");
                else
                    _logger.Log(NLog.LogLevel.Info, $"No");
            }
c# .net ssl certificate x509certificate
1个回答
1
投票

在这种情况下,当未将证书颁发给安装它的服务器时,X509Certificate2.Verify()将返回true。

Verify方法不检查有关主机名的任何内容。它验证

  • 证书未过期。
  • 证书最终链接到受信任的根颁发机构。
  • 链中的所有证书都有适当的嵌套到期时间。
  • 目标证书,除非它是自己发行的,具有撤销端点,并且不会被撤销。
  • 任何中间证书都具有撤销端点,并且不会被撤销。

完全等于

using (X509Chain chain = new X509Chain())
{
    // Use the default vales of chain.ChainPolicy including:
    //  RevocationMode = X509RevocationMode.Online
    //  RevocationFlag = X509RevocationFlag.ExcludeRoot
    //  VerificationFlags = X509VerificationFlags.NoFlag
    //  VerificationTime = DateTime.Now
    //  UrlRetrievalTimeout = new TimeSpan(0, 0, 0)

    bool verified = chain.Build(cert);

    for (int i = 0; i < chain.ChainElements.Count; i++)
    {
        chain.ChainElements[i].Certificate.Dispose();
    }

    return verified;
}

是否有完成的代码块可以对X509证书进行完全验证?

如果“完全验证”仅表示Verify所做的所有事情,则为是。如果您还关心它可以用作TLS客户端证书(或TLS服务器证书)有效,则可以使用较长的格式(直接使用X509Chain)并在调用chain.Build之前添加应用程序策略要求。

// See if it's valid as a TLS server
chain.ChainPolicy.ApplicationPolicy.Add(new Oid("1.3.6.1.5.5.7.3.1"));
// Alternatively, if it's valid as a TLS client
chain.ChainPolicy.ApplicationPolicy.Add(new Oid("1.3.6.1.5.5.7.3.2"));

主机名要难得多。客户端证书没有可验证的名称,这取决于服务器使用的名称。服务器证书的主机名与SAN / Subject-CN匹配,但是没有内置的功能可以进行检查,而不仅仅是与TLS(SslStream)连接。

© www.soinside.com 2019 - 2024. All rights reserved.