首页 > 解决方案 > 将 CRL 分发点 (CDP) 扩展添加到 X509Certificate2 证书

问题描述

我试图在纯 .NET 4.7.2 中
向我的 X509Certificate2 对象添加证书扩展我通过这种方法使用 BouncyCastle:

private static void AddCdpUrl(X509V3CertificateGenerator certificateGenerator, string cdptUrl)
{
    var uriGeneralName = new GeneralName(GeneralName.UniformResourceIdentifier, cdptUrl);
    var cdpName = new DistributionPointName(DistributionPointName.FullName, uriGeneralName);
    var cdp = new DistributionPoint(cdpName, null, null);
    certificateGenerator.AddExtension(X509Extensions.CrlDistributionPoints, false, new CrlDistPoint(new[] { cdp }));
}

添加它的作品,我得到了很好的结果:
在此处输入图像描述

现在在纯 .NET 中,我正在使用这种方法:

const string X509CRLDistributionPoints = "2.5.29.31";    
certificateRequest.CertificateExtensions.Add(new X509Extension(new Oid(X509CRLDistributionPoints), Encoding.UTF8.GetBytes("http://crl.example.com"), false));

并得到这个结果:
在此处输入图像描述

我缺少“分发点名称”、“全名”和“URL=”的序列

如何生成与 BouncyCastle 使用纯 .NET 相同的结果

谢谢

标签: c#bouncycastlex509certificate2.net-4.7.2

解决方案


如果您只想编写一个分发点,并且它的长度小于或等于 119 个 ASCII 字符,并且您没有将 CRL 签名权限委托给不同的证书:

private static X509Extension MakeCdp(string url)
{
    byte[] encodedUrl = Encoding.ASCII.GetBytes(url);

    if (encodedUrl.Length > 119)
    {
        throw new NotSupportedException();
    }

    byte[] payload = new byte[encodedUrl.Length + 10];
    int offset = 0;
    payload[offset++] = 0x30;
    payload[offset++] = (byte)(encodedUrl.Length + 8);
    payload[offset++] = 0x30;
    payload[offset++] = (byte)(encodedUrl.Length + 6);
    payload[offset++] = 0xA0;
    payload[offset++] = (byte)(encodedUrl.Length + 4);
    payload[offset++] = 0xA0;
    payload[offset++] = (byte)(encodedUrl.Length + 2);
    payload[offset++] = 0x86;
    payload[offset++] = (byte)(encodedUrl.Length);
    Buffer.BlockCopy(encodedUrl, 0, payload, offset, encodedUrl.Length);

    return new X509Extension("2.5.29.31", payload, critical: false);
}

外部有效载荷长度超过 119 个字符0x7F,然后你真的开始想要一个合适的 DER 编码器。您肯定需要一个用于可变数量的 URL,或者包括扩展中的任何可选数据。


推荐阅读