我正在尝试以编程方式创建CSR。我读过有关ASN.1,RFC 2986,X.509的内容
我还手动解析了几个使用OpenSSL
创建的DER编码的CSR文件
除了几件事之外,一切看起来都很清楚:
公钥部分在BIT STRING内容之前(以及8D 00 30 81 89 02 81 81
之后)包含下一个字节03 81
。这是什么?我注意到用DER编码的所有CSR文件都包含它们。我没有在RFC中找到任何关于它们的内容。
签名部分在签名内容之前但在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
部分。
提前致谢。
答案 0 :(得分:3)
SubjectPublicKeyInfo中的BIT STRING取决于您的公钥算法。内容再次进行DER编码,请参阅RFC 3370了解可能性。
如果您的签名看起来像
03 81 81 00 64 12 ... 24 B1 28
这应解释如下。 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环境。