2

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

我有一个自签名的根证书 (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
                }
            }
4

1 回答 1

1

它是否在内部使用数字签名?

确切地。

我试图调试整个事情,但以 DLL 导入结束,它使用来自 Libraries.Crypt32 的 CertGetCertificateChain 方法。

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

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

于 2021-01-04T12:15:22.213 回答