在 X509Chain 中使用自定义根目录进行在线吊销检查

Online Revocation Checking Using Custom Root in X509Chain

我需要使用未存储在受信任的根 CA 存储中的根证书来验证叶证书。使用 X509Chain 并将 X509ChainPolicy.RevocationMode 设置为 X509RevocationMode.NoCheck 并将 X509ChainPolicy.VerificationFlags 设置为包含标志 X509VerificationFlags.AllowUnknownCertificateAuthority 时,这非常有效。我使用 X509Chain.ChainPolicy.ExtraStore.

向 X509Chain 提供我的根证书

当我想检查叶证书的吊销状态时出现问题。叶证书提供 CRL 分发点,但在使用 X509RevocationMode.Online 时,我得到这些状态:X509ChainStatusFlags.RevocationStatusUnknownX509ChainStatusFlags.OfflineRevocation

如果我将根安装到受信任的根 CA 存储中,吊销检查工作正常。但是,如前所述,我的应用程序不会将这些安装到证书库中。

以下是我目前尝试执行此操作的方法:

Dim certChain As New X509Chain
certChain.ChainPolicy.RevocationMode = X509RevocationMode.Online
certChain.ChainPolicy.RevocationFlag = X509RevocationFlag.EndCertificateOnly
certChain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority Or X509VerificationFlags.IgnoreNotTimeValid
certChain.ChainPolicy.ExtraStore.Add(rootCertificate)

Dim blnValid As Boolean = certChain.Build(certificate)

感谢任何帮助。

这在当前版本的 .NET 中是不可能的。

已经为 .NET 5 编写了一项功能,但尚未发布,您可以添加

certChain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
certChain.ChainPolicy.CustomTrustStore.Add(rootCert);

然后用指定的证书替换该链的根信任列表。

但系统不会下载或从缓存中处理来自不受信任机构的撤销。当前 .NET 的唯一选择是

  • 将您的证书注册为受信任的
  • 不关心撤销
  • 使用另一个链提供者(P/Invoking 进入 OS 库,或使用第三方库)。