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

时间:2017-01-11 22:08:13

标签: c# security asp.net-core certificate certificate-revocation

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

我本地有我的CRL(.pem)文件,我想将其添加到撤销过程中。

我正在考虑做CRL validation这样的事情,使用distributionPoint oid导入我的X509CertificateX509Extension,但我无法理解它。

这是我的一个回调代码

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;
    };
}

感谢您的帮助&amp;澄清

1 个答案:

答案 0 :(得分:0)

如果您想托管自己的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 

希望有所帮助