Добавьте расширение точек распространения CRL (CDP) к сертификату X509Certificate2 - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь добавить расширение сертификата для моего объекта X509Certificate2 в чистом виде. NET 4.7.2 Я использовал 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 }));
}

Добавьте его работы, и я получу отличный результат: enter image description here

Сейчас в чистом виде. NET Я использую этот метод:

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

И получите такой результат: enter image description here

Мне не хватает последовательностей для «Имя точки распространения», «Полное имя» и «URL =»

Как я могу получить тот же результат, что BouncyCastle делает с чистым. NET Спасибо

1 Ответ

1 голос
/ 22 марта 2020

Если вы хотите написать только одну точку распространения, длина которой меньше или равна 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);
}

Past 119 символов длина внешней полезной нагрузки превышает 0x7F, и тогда вы действительно начинаете нуждаться в правильном кодере DER. Вам определенно нужен один для переменных номеров URL-адресов или для включения любых дополнительных данных из расширения.

...