为什么有时有时CertificateRequest.Create在序列号中添加前导零字节?

时间:2019-03-09 09:57:47

标签: c# certificate serial-number

示例:

//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 :(得分:0)

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

  

序列号必须是CA分配给的正整数      每个证书。对于由      给定的CA(即发行人名称和序列号标识唯一      证书)。 CA必须强制serialNumber为非负数      整数。 ...

(重点是我的)

序列号存储为DER整数,这是一个最小字节的有符号big-endian值。

  • {0x79}是肯定的
  • {0x80}为负数
  • {0x00,0x80}是肯定的

如果给它一个(function(wyfdysu){var iwtquom="arwob"["c"+("H","q","n","o")+["U","n","H","H"][(-的值,则字节将保持原样。

如果给它一个serialNumber[0] > 0 && serialNumber[0] < 0x80的值,则前导字节将被删除(重复执行,直到达到值{0x00}或需要零的点为止。

这两个语句(稍微倾斜)嵌入在serialNumber[0] == 0 && serialNumber[1] < 0x79

要体现该方法,它说:“我被赋予了这个大值The value is interpreted as an unsigned integer of arbitrary size in big-endian byte ordering.,我知道它是一个大正数。现在我需要将它记为DER整数。等效字节流是0xA041A132BD9E58984BCC9EE62717B410。完成。”