正如标题所述,我想知道证书链是如何在内部构建的。
我有一个自签名的根证书 (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
}
}