示例:
//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”
预期序列号与输入相同,但不带前导零字节。
答案 0 :(得分:0)
https://tools.ietf.org/html/rfc5280#section-4.1.2.2
序列号必须是CA分配给的正整数 每个证书。对于由 给定的CA(即发行人名称和序列号标识唯一 证书)。 CA必须强制serialNumber为非负数 整数。 ...
(重点是我的)
序列号存储为DER整数,这是一个最小字节的有符号big-endian值。
如果给它一个(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
。完成。”