如何在使用本地 CRL 文件(C#)的验证过程中检查客户端证书吊销
Posted
技术标签:
【中文标题】如何在使用本地 CRL 文件(C#)的验证过程中检查客户端证书吊销【英文标题】:How to check client certificate revocation during validation process with local CRL file (C#) 【发布时间】:2017-05-26 21:01:06 【问题描述】:我正在尝试使用 HttpClientHandler.ServerCertificateCustomValidationCallback
验证客户端证书。我已经用我的ChainPolicy
参数构建了我的x509chain
。
我在本地有我的 CRL (.pem) 文件,我想将其添加到吊销流程中。
我正在考虑做类似CRL validation 之类的操作,将带有distributionPoint oid 的X509Extension
导入我的X509Extension
,但我无法理解它。
这是我的一段回调代码
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;
;
感谢您的帮助和澄清
【问题讨论】:
有什么问题? @Mike_G 抱歉,这是我的第一篇文章。如何在撤销过程中添加我的本地 CRL 文件? 【参考方案1】:如果您想托管自己的 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
希望有帮助
【讨论】:
好吧,您的解决方案运行良好,但我的问题是关于从本地文件中脱机撤销.. 您是否尝试将 nsCaRevocationUrl /crlDistributionPoints 的路径更改为 \\Machinename\c$\certrevlist\my.crl 我发现dotnet只检查带有http源的crls:dotnet cource 谢谢,很高兴知道这一点。我想这是不可能的,除非你安装一个“本地”网络服务器。以上是关于如何在使用本地 CRL 文件(C#)的验证过程中检查客户端证书吊销的主要内容,如果未能解决你的问题,请参考以下文章