当我尝试从 DER 证书获取签名时,openssl 命令“openssl x509 -in .der -noout -text”
输出显示为:
签名算法:sha256WithRSAEncryption
签名值:'
xx:xx:xx:xx:xx:xx:xx:xx
.......................
..................xx:xx
在网站中,https://lapo.it/asn1js/当我上传 DER 文件时,签名字段显示为(2048 位)和一些二进制值。签名的实际 der 格式开头为“03 82 01 01 xx xx xx xx ..xx xx”。 03 82 01 01 之后的值与 openssl 签名值中的值不匹配;我不确定实际签名如何编码为 DER 格式以及如何解释它并将其转换为十六进制。据我了解,在 DER 编码中,我们必须添加 03 82 01 01,然后添加签名值。
示例我尝试使用 openssl 仅输出签名作为“openssl asn1parse -in .pem -strparse 799 -outsignature.bin”,该值与“openssl x509 -in .der -noout -text”输出匹配。有人可以告诉我这个实际签名如何编码到证书中以及如何解释它们。谢谢
我理解在DER编码中,我们必须添加03 82 01 01,然后添加签名值。
嗯,差不多了。在X.509规范中,签名定义如下:
signatureValue 字段包含根据计算得出的数字签名 ASN.1 DER 编码的 tbsCertificate。 ASN.1 DER 编码 tbsCertificate 用作签名函数的输入。 这个 签名值被编码为 BIT STRING 并包含在 签名字段。 此过程的详细信息是为每个 [RFC3279]、[RFC4055] 和 [RFC4491] 中列出的算法。
现在 ASN.1 BIT STRING 被编码为 DER TLV 格式,如标记、长度、值:
03 82 01 01 00 XX XX XX ..................................... XX
TT LL LL LL BB 128 bytes for a 1024 bit signature / RSA key size
这里TT是标签的十六进制表示,82意味着需要多于1个长度字节,准确地说是2个。然后
01 01
就是值的长度。嗯,差不多了,因为 BIT STRING 通常还有一个 00
字节,表示 BIT STRING 值中的所有位都已使用(如果最后一个字节包含未使用的位,则其值可以为 00
到 07
)。
BIT STRING 的 DER 编码规则可以在很多文档中找到,或者您可以购买 ISO/IEC 8859 规范。
签名本身在 PKCS #1:RSA 加密规范版本 2.2中定义。
最后,要了解事物是如何构建的,可以在标准中找到。谁会觉得呢?实际上,如果您查看 X.509 标准,您会发现整个证书结构是用 ASN.1 表示法定义的,指定了它的每个可能的位(假设 DER,并考虑其他参考标准)。