Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将CRL分发点(CDP)扩展添加到X509Certificate2证书_C#_Bouncycastle_X509certificate2_.net 4.7.2 - Fatal编程技术网

C# 将CRL分发点(CDP)扩展添加到X509Certificate2证书

C# 将CRL分发点(CDP)扩展添加到X509Certificate2证书,c#,bouncycastle,x509certificate2,.net-4.7.2,C#,Bouncycastle,X509certificate2,.net 4.7.2,我正在尝试将证书扩展添加到纯.NET 4.7.2中的X509Certificate2对象 我通过以下方法使用BouncyCastle: private static void AddCdpUrl(X509V3CertificateGenerator certificateGenerator, string cdptUrl) { var uriGeneralName = new GeneralName(GeneralName.UniformResourceIdentifier, cdptU

我正在尝试将证书扩展添加到纯.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时相同的结果


如果您只想编写一个分发点,且其长度小于或等于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,或包含扩展名中的任何可选数据。

这可能有点晚了,但您可以使用BC作为实用工具来获取DER编码的扩展名并将其导入本机.NET,如下所示:

// req is a .NET Core 3.1 CertificateRequest object
req.CertificateExtensions.Add(
    new X509Extension(
          new Oid("2.5.29.31"),
          crlDistPoint.GetDerEncoded(), // this is your CRL extension
          false
          )
     );

.NET不支持CDP扩展。为此,您必须使用第三方库。如果BC适合您,它就可以。@Crypt32-我不想使用BC,然后再找其他东西。发明自己的代码是没有成本效益的。至少没有一个像样的ASN.1库。