【发布时间】:2020-11-10 17:37:51
【问题描述】:
我们有一个用 python 编写的测试套件,我必须使用 PKI 添加测试。对于证书注册,我必须将 CSR 和制造证书放入 CMS 并将其发送到 PKI。
使用 openssl 我可以做到:
openssl smime -sign -outform PEM -signer manufacture.crt -inkey DMC.key -in CSR.pem -binary -nodetach -out CMS.p7
在这种情况下,我的密钥是使用 openssl 生成的。但是我们必须使用硬件安全元件来生成密钥并计算签名。 到目前为止,我可以使用 python 创建相同的 CMS 结构,但无法使用 openssl 进行验证:
openssl cms -verify -noverify -inform PEM -in python_generated_cms.txt
结果是“验证失败”。但是当我添加选项 -nosigs 时,optput 就是我的 CSR。所以我的签名似乎无效。我研究过rfc5652,但没有成功。
这是我计算签名的工作流程:
- 根据chapter 11.2消息摘要是PEM编码的 使用摘要算法消化 CSR。
- 然后chapter 5.4 说 如果 signedAttrs 存在,签名计算的输入 是 SignedAttrs 的完整 DER endoced 值。所以我采取 signedAttrs 内容的完整二进制表示(标记 在下面的部分中带有 *)。
- 我将“隐式标记”[0] 更改为 "EXPLICIT SET OF" 通过将第一个字节形式 0xA0 更改为 0x31
- 用我的算法对应的算法散列这个数据 硬件安全元件 (SHA384)。
- 将此哈希发送到 seucre 元素以计算签名。
- 签名由 48 字节组成,每个 r 和 s 部分将打包在一个以 0x30、0x64 开头的 ans1 签名中,这将作为签名添加到签名者信息中
以我解析的 CMS 为例:
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.7.2 signedData (PKCS #7)
[0] (1 elem)
SEQUENCE (5 elem)
INTEGER 1
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm)
NULL
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.7.1 data (PKCS #7)
[0] (1 elem)
OCTET STRING (416 byte) 2D2D2D2D2D424547494E20434554553542D2D2D2D2… [CMS]
[0] (1 elem)
SEQUENCE (3 elem)
... shorted certificate here ...
SEQUENCE (1 elem)
OBJECT IDENTIFIER 1.2.840.10045.4.3.3 ecdsaWithSHA384 (ANSI X9.62 ECDSA algorithm with SHA384)
BIT STRING (1 elem)
SEQUENCE (2 elem)
INTEGER (384 bit) 251806783159843676750320964557058746…
INTEGER (383 bit) 146223079633757899471433693312235433…
SET (1 elem)
SEQUENCE (6 elem)
INTEGER 1
SEQUENCE (2 elem)
SEQUENCE (4 elem)
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.5.4.6 countryName (X.520 DN component)
PrintableString CH
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.5.4.10 organizationName (X.520 DN component)
PrintableString My organisation
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.5.4.11 organizationalUnitName (X.520 DN component)
PrintableString PKI
SET (1 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.5.4.3 commonName (X.520 DN component)
PrintableString Non-Prod CA
INTEGER (82 bit) 3419130548216348442042883485
SEQUENCE (2 elem)
OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm)
NULL
* [0] (4 elem)
* SEQUENCE (2 elem)
* OBJECT IDENTIFIER 1.2.840.113549.1.9.3 contentType (PKCS #9)
* SET (1 elem)
* OBJECT IDENTIFIER 1.2.840.113549.1.7.1 data (PKCS #7)
* SEQUENCE (2 elem)
* OBJECT IDENTIFIER 1.2.840.113549.1.9.5 signingTime (PKCS #9)
* SET (1 elem)
* UTCTime 2020-06-26 07:13:41 UTC
* SEQUENCE (2 elem)
* OBJECT IDENTIFIER 1.2.840.113549.1.9.4 messageDigest (PKCS #9)
* SET (1 elem)
* OCTET STRING (32 byte) 6558254059E939DF800A748CCF2F582371AC1… [message digest]
* SEQUENCE (2 elem)
* OBJECT IDENTIFIER 1.2.840.113549.1.9.15 sMIMECapabilities
* SET (1 elem)
* SEQUENCE (8 elem)
* SEQUENCE (1 elem)
* OBJECT IDENTIFIER 2.16.840.1.101.3.4.1.42 aes256-CBC (NIST Algorithm)
* SEQUENCE (1 elem)
* OBJECT IDENTIFIER 2.16.840.1.101.3.4.1.22 aes192-CBC (NIST Algorithm)
* SEQUENCE (1 elem)
* OBJECT IDENTIFIER 2.16.840.1.101.3.4.1.2 aes128-CBC (NIST Algorithm)
* SEQUENCE (1 elem)
* OBJECT IDENTIFIER 1.2.840.113549.3.7 des-EDE3-CBC (RSADSI encryptionAlgorithm)
* SEQUENCE (2 elem)
* OBJECT IDENTIFIER 1.2.840.113549.3.2 rc2CBC (RSADSI encryptionAlgorithm)
* INTEGER 128
* SEQUENCE (2 elem)
* OBJECT IDENTIFIER 1.2.840.113549.3.2 rc2CBC (RSADSI encryptionAlgorithm)
* INTEGER 64
* SEQUENCE (1 elem)
* OBJECT IDENTIFIER 1.3.14.3.2.7 desCBC
* SEQUENCE (2 elem)
* OBJECT IDENTIFIER 1.2.840.113549.3.2 rc2CBC (RSADSI encryptionAlgorithm)
* INTEGER 40
SEQUENCE (1 elem)
OBJECT IDENTIFIER 1.2.840.10045.4.3.2 ecdsaWithSHA256 (ANSI X9.62 ECDSA algorithm with SHA256)
OCTET STRING (1 elem)
SEQUENCE (2 elem)
INTEGER (384 bit) 37299296495250608665729486640423992…
INTEGER (383 bit) 16047350112473148250997959352782288…
在计算我的 CMS 签名时我做错了什么?
【问题讨论】:
-
经过进一步调查,SignedAttrs 字段与 OpenSSL 中的工作字段完全相同。现在唯一的区别是签名......