【问题标题】:How exactly is a Certificate chain built?证书链究竟是如何构建的?
【发布时间】:2021-01-04 10:48:54
【问题描述】:

正如标题所述,我想知道证书链是如何内部构建的。

我有一个自签名的根证书 (CA) 和一个传入的用户证书,据说它已经由我的根签名,这是我必须测试的。可以使用 X509Certificate2.Verify() 方法测试 X509Certificate2,该方法使用具有一些标准设置的 X509Chain。为了完全控制这个过程,我直接使用 X509Chain。由于我的根未安装在机器上(不在受信任的根证书存储中),我将其添加到 ChainPolicy 的 ExtraStore。

整个魔法发生在 X509Chain.Build() 方法中,我通过了我的“待测试”用户证书。链得到构建,从传递的证书开始,以自签名的根结束。但具体如何?如何测试证书是否已由一个或另一个根签名?它是否在内部使用数字签名?

我尝试调试整个事情,但以 DLL 导入结束,该导入使用 Libraries.Crypt32 中的 CertGetCertificateChain 方法。那是 C++ 的东西,超出了我的知识范围。

到目前为止的简化代码:

using (var chain = new X509Chain
            {
                ChainPolicy =
                {
                    RevocationMode = X509RevocationMode.NoCheck,
                    RevocationFlag = X509RevocationFlag.ExcludeRoot,
                    VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority,
                    VerificationTime = DateTime.Now,
                    UrlRetrievalTimeout = new TimeSpan(0, 0, 0)
                }
            })
            {
                chain.ChainPolicy.ExtraStore.Add(authority);

                if (!chain.Build(signedCertificate))
                {
                    //Errorhandling
                }

                //Root certificate should always be last in the X509ChainElements collection
                var isSignedByCorrectRootCert =
                    chain.ChainElements
                        .Cast<X509ChainElement>()
                        .Last()
                        .Certificate.Thumbprint == authority.Thumbprint;

                if (!isSignedByCorrectRootCert)
                {
                    //Errorhandling
                }
            }

【问题讨论】:

标签: c# x509certificate x509chain


【解决方案1】:

内部是否使用数字签名?

没错。

我尝试调试整个事情,但以 DLL 导入结束,该导入使用 Libraries.Crypt32 中的 CertGetCertificateChain 方法。

是的,.NET X509Chain 类只不过是 CryptoAPI 本机 (C++) 函数的简单包装器。我想说 .NET 中 95% 以上的密码学内容是 CryptoAPI 函数的包装器。

几年前,我写了一篇博文,解释了如何在 Microsoft Windows 中执行链构建:Certificate Chaining Engine — how it works。这篇文章解释了链接引擎如何在将其发送到验证例程之前构建链并在链中绑定证书。链验证是一个复杂得多的过程。验证逻辑在RFC 5280, §6中描述

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2014-12-16
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多