【问题标题】:How to fully validate a X509 certificate?如何完全验证 X509 证书?
【发布时间】:2020-05-23 08:30:23
【问题描述】:

我需要验证证书 (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】:

在这种情况下,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)并在调用链之前添加应用程序策略要求。构建:

// 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) 连接外,没有任何内置功能可以进行检查。

【讨论】:

  • 谢谢@bartonjs,så 没有必要或方法来检查证书是否已颁发给提供它的服务器?它只能在安装它的计算机上吗?我认为这是互联网上证书的重要部分之一,以验证我知道我真正与谁交谈?
  • @Banshee 它是 TLS/SSL 的重要组成部分 SslStream 进行检查,但在 SslStream 之外进行检查并非易事。
  • 好的,所以要真正验证 .NET 中的证书,我必须尝试连接。没有其他合理的方法可以进行同样广泛的检查吗?
  • @Banshee 如果您需要进行主机名验证,可以。请记住,一台计算机可以有许多不同的名称,而对 TLS 来说唯一重要的是证书与用于该连接的名称匹配。
猜你喜欢
  • 2011-04-06
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2011-02-14
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多