Почему CertificateRequest.Create иногда добавляет начальный нулевой байт к серийному номеру? - PullRequest
1 голос
/ 09 марта 2019

Пример:

//generate specific serial number for testing purposes
byte[] result = "A0-41-A1-32-BD-9E-58-98-4B-CC-9E-E6-27-17-B4-10"
   .Split('-')
   .Select(item => Convert.ToByte(item, 16))
   .ToArray();

using (X509Certificate2 cert = certRequest.Create(
        caCert,
        DateTimeOffset.UtcNow.AddDays(-1),
        DateTimeOffset.UtcNow.AddYears(50),
        serialNumber))
    {
        // display serial number for testing purposes
        Console.WriteLine(cert.SerialNumber);
    }

Серийный номер ввода: "A0-41-A1-32-BD-9E-58-98-4B-CC-9E-E6-27-17-B4-10"

Действительный серийный номер сертификата: " 00 -A0-41-A1-32-BD-9E-58-98-4B-CC-9E-E6-27-17-B4-10"

Ожидается, что серийный номер будет таким же, как вход без начального нулевого байта.

Метод документа: https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.certificaterequest.create?view=netframework-4.7.2

1 Ответ

0 голосов
/ 09 марта 2019

https://tools.ietf.org/html/rfc5280#section-4.1.2.2

Серийный номер ДОЛЖЕН быть положительным целым числом, назначенным СА каждому сертификату.Он ДОЛЖЕН быть уникальным для каждого сертификата, выданного данным СА (т. Е. Имя и серийный номер эмитента определяют уникальный сертификат). ЦС ДОЛЖНЫ сделать так, чтобы serialNumber был неотрицательным целым числом. ...

(выделено мной)

Серийный номерхранится как целочисленное значение DER, которое является байтовым значением с прямым порядком байтов с минимальным байтом.

  • {0x79} положительно
  • {0x80} отрицательно
  • {0x00, 0x80} положительно

Если вы зададите ему значение где serialNumber[0] > 0 && serialNumber[0] < 0x80, тогда байты останутся как есть.

Если вы зададите ему значение где serialNumber[0] == 0 && serialNumber[1] < 0x79затем начальный байт удаляется (повторяйте до тех пор, пока не достигнете значения {0x00} или точки, где необходим ноль).

Эти два оператора (слегка наклонно) встроены в The value is interpreted as an unsigned integer of arbitrary size in big-endian byte ordering.

Чтобы персонализировать метод, он говорит: «Мне дали это большое значение, 0xA041A132BD9E58984BCC9EE62717B410, которое, как я знаю, является большим положительным числом. Теперь мне нужно записать его как целое число DER. Эквивалентный поток байтов равен { 0x00, 0xA0, 0x41, 0xA1, 0x32, 0xBD, 0x9E, 0x58, 0x98, 0x4B, 0xCC, 0x9E, 0xE6, 0x27, 0x17, 0xB4, 0x10 }.Готово ".

...