以编程方式创建CSR

时间:2011-08-03 19:22:11

标签: pki x509 asn.1 csr der

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

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

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

  3. 提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

  3. 这应解释如下。 DER是TLV(标记 - 长度 - 值)编码。因此,第一个字节(用于说明的八位字节)表示正确注意到的标签--BIT STRING 03.

    第二个字节决定长度:

      

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

         

    a)第8位应为1;

         

    b)第7位到第1位应编码长度八位字节中后续八位字节的数量,作为无符号二进制整数     第7位作为最重要的位;

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

答案 1 :(得分:1)

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