如何在验证过程中使用本地CRL文件(C#)检查客户端证书吊销



我正在尝试使用HttpClientHandler.ServerCertificateCustomValidationCallback验证客户端证书。我已经用ChainPolicy参数构建了我的x509chain

我在本地有我的CRL(.pem)文件,我想把它添加到吊销过程中。

我想做一些类似CRL验证的事情,将带有distributionPoint oid的X509Extension导入到我的X509Certificate中,但我很难理解它。

这是我的一段回调代码

private static Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool>
ServerCertificateCustomValidationCallback()
{
return (sender, cert, chain, sslPolicyErrors) =>
{
X509Certificate2 ca = new X509Certificate2(@"pathToCa\ca.crt");
X509Chain chai = new X509Chain();
chai.ChainPolicy.ExtraStore.Add(ca);
chai.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chai.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chai.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
chai.ChainPolicy.VerificationTime = DateTime.Now;
try
{
if (!chai.Build(cert))
{
return false;
}
foreach (X509ChainStatus status in chai.ChainStatus)
{
if (status.Status == X509ChainStatusFlags.UntrustedRoot) continue;
if (status.Status == X509ChainStatusFlags.OfflineRevocation) continue;
if (status.Status == X509ChainStatusFlags.RevocationStatusUnknown) continue;
return false;
}
}
catch (Exception e)
{
throw e;
}
return true;
};
}

感谢您的帮助&澄清

如果你想托管你自己的CRL,你需要在某个地方设置服务器,这样它就可以像托管html页面一样托管你的CRL。

因此,例如,如果您使用openSSL或最好是LibreSSL在配置文件中创建自己的证书,您将添加以下内容:

crlDistributionPoints  = URI:http://myserver.com/mycert.crl
nsCaRevocationUrl =  http://myserver.com/mycert.crl

(你可以尝试使用上面密钥的绝对路径,但我不确定这是否有效,如果它确实让我知道的话)

有几个教程可以帮助进行此设置,https://jamielinux.com/docs/openssl-certificate-authority/非常好和详细。

在我自己做这件事的时候,我发现当你调用构建链时,.Net框架会检查链,所以你不需要添加额外的代码来确保它检查CRL,因为这是自动发生的。(您可以通过检查服务器日志文件来检查crl是否被提取)

你可以通过将自己的证书添加到CRL来测试这一点,你应该会发现你得到了

X509ChainStatusFlags.Revoked 

希望能帮助

最新更新