【问题标题】:Why does CertificateRequest.Create add a leading zero byte to the serial number sometimes?为什么 CertificateRequest.Create 有时会在序列号中添加前导零字节?
【发布时间】:2019-03-10 04:16:16
【问题描述】:

例子:

//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

【问题讨论】:

  • 怀疑很明显它不是负面的。对于输入,“该值被解释为大端字节顺序中任意大小的无符号整数。”返回一个以 00 开头的值意味着即使将最高位的值视为负数,整数值仍然是正确的。要验证此假设,请尝试使用以“70”而不是“A0”开头的序列号。
  • 阅读remarks section on ToByte(String, Int32) - “如果fromBase是16”.

标签: c# certificate serial-number


【解决方案1】:

https://www.rfc-editor.org/rfc/rfc5280#section-4.1.2.2

序列号必须是 CA 分配给 每个证书。对于由 给定的 CA(即发行人名称和序列号标识唯一的 证书)。 CA 必须强制 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 整数。等效的字节流是 @987654326 @. 完成。”

【讨论】:

  • 感谢大家的快速帮助。 (直到现在无法回答,因为存在帐户创建问题)
猜你喜欢
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2016-05-16
  • 2013-07-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
相关资源
最近更新 更多