1

我正在尝试以编程方式创建 CSR。我读过 ASN.1、RFC 2986、X.509。
我还手动解析了几个 DER 编码的 CSR 文件,这些文件是使用OpenSSL.
一切看起来都很清楚,除了几件事:

  1. 公钥部分包含8D 00 30 81 89 02 81 81BIT STRING 内容之前(和之后03 81)的下一个字节。这是什么?我注意到所有用 DER 编码的 CSR 文件都包含它们。我在 RFC 中没有找到任何关于它们的信息。

  2. 签名部分包含签名内容之前但之后的下一个不清楚的字节03 81。据我了解,这部分包含有关 BIT STRING 中最后一个八位字节的信息(实际上应该在最后一个字节中占用多少位)。但我不明白如何解码这些字节。例如,签名可能如下所示:
    03 81 81 00 64 12 ... 24 B1 28
    其中03h是 BIT STRING 格式,81h位字符串的长度,64 12 ... 24 B1 28是签名(但它的长度为 80h)。我不明白这部分81 00

提前致谢。

4

2 回答 2

3
  1. SubjectPublicKeyInfo 中的 BIT STRING 取决于您的公钥算法。内容再次进行 DER 编码,请参阅RFC 3370了解可能性。

  2. 如果你的签名看起来像

    03 81 81 00 64 12 ... 24 B1 28

这将被解释如下。DER是一种 TLV(标签 - 长度 - 值)编码。所以第一个字节(用他们的话来说是八位字节)代表标签 - 03 代表 BIT STRING,正如您正确注意到的那样。

第二个字节确定长度:

在长格式中,长度八位字节应由一个初始八位位组和一个或多个后续八位位组组成。初始八位字节应编码如下:

a) 位 8 应为 1;

b) 位 7 到 1 应将长度八位组中后续八位组的数量编码为无符号二进制整数,位 7 为最高有效位;

81将第 8 位设置为 1,因此其余位表示确定总长度的字节数。在您的情况下,它只是1字节。所以下一个字节是你的长度 - 81 等于 129 字节的签名长度。所以下面的 129 个字节代表你的值,从 00 开始。

于 2011-08-04T09:17:42.693 回答
1

当您说“以编程方式”时,您到底是什么意思?在代码中?如果是这样,您使用的是什么语言?BouncyCastle JCE提供程序包含用于生成 PKCS#10 请求的类,前提是您使用的是 Java。您需要做的就是指定必要的组件(DN、公钥等)。我相信还有一个 .Net 实现,它可能更适合 Microsoft 环境。

于 2011-08-09T18:54:10.063 回答