因此我创建了一个 PKCS7 签名消息,并尝试使用以下命令通过 OpenSSL 对其进行验证:
openssl cms -in demo.p7m -inform DER -verify
这样做会返回以下错误:
140653850015376:error 2E09D08A:CMS routines:CMS_verify:signer certificate not found:cms_smime.c:353:
我不明白这个错误。以下是输出openssl asn1parse -in demo.p7m -i -inform DER
:
以下是 base64 编码的 PKCS7:
X509证书如下:
-----BEGIN CERTIFICATE-----
MIIB4zCCAU6gAwIBAgIAMAsGCSqGSIb3DQEBBTA5MRwwGgYDVQQKDBNwaHBzZWNsaWIgZGVtbyBj
ZXJ0MRkwFwYDVQQDDBB3d3cud2hhdGV2ZXIuY29tMCIYDzIwMTIwNjA0MDMxMDMxWhgPMjAxMzA2
MDQwMzEwMzFaMDkxHDAaBgNVBAoME3BocHNlY2xpYiBkZW1vIGNlcnQxGTAXBgNVBAMMEHd3dy53
aGF0ZXZlci5jb20wgZ0wCwYJKoZIhvcNAQEBA4GNADCBiQKBgQCtYr+TcpSQ043ZZi+akC1LR5Q6
MJPJ6/0MQ7IFPt/SCywaxsdFsNQ40+TOSFNkG68nscyB5nEPDkNzLJ7AklNSRHItqxTwohuW4a+f
BfzAi0vXS9IrM2iep13cHE9r5QW9pouRQiYfbi5FegEWbtIc5SrmAxHAH9K3KGRaXEeufwIDAQAB
MAsGCSqGSIb3DQEBBQOBgQBYEsMuWBA9ie4ulXxeLhLoQvEo6vgl5LDRFMuP+AhkKzfXUo2yEMWP
/QxbSglcPT/ycb+5+FhYGWxGatM5V+sB43ZBHZD14ZWPN35ePmDIfqXdRmphhXuhdNU7DWwp97ZR
c26CQXzHurRf29VloV8k5JKwsfnLRPVCrbJySMB6dg==
-----END CERTIFICATE-----
该证书可以很好地进行解析openssl x509 -in cert.txt -text -noout
。
该证书是自签名证书。颁发者 DN 如下:
92:d=6 hl=2 l= 57 cons: SEQUENCE
94:d=7 hl=2 l= 28 cons: SET
96:d=8 hl=2 l= 26 cons: SEQUENCE
98:d=9 hl=2 l= 3 prim: OBJECT :organizationName
103:d=9 hl=2 l= 19 prim: UTF8STRING :phpseclib demo cert
124:d=7 hl=2 l= 25 cons: SET
126:d=8 hl=2 l= 23 cons: SEQUENCE
128:d=9 hl=2 l= 3 prim: OBJECT :commonName
133:d=9 hl=2 l= 16 prim: UTF8STRING :www.whatever.com
与 SignerInfo 中的颁发者 DN 匹配:
782:d=14 hl=2 l= 57 cons: SEQUENCE
784:d=15 hl=2 l= 28 cons: SET
786:d=16 hl=2 l= 26 cons: SEQUENCE
788:d=17 hl=2 l= 3 prim: OBJECT :organizationName
793:d=17 hl=2 l= 19 prim: UTF8STRING :phpseclib demo cert
814:d=15 hl=2 l= 25 cons: SET
816:d=16 hl=2 l= 23 cons: SEQUENCE
818:d=17 hl=2 l= 3 prim: OBJECT :commonName
823:d=17 hl=2 l= 16 prim: UTF8STRING :www.whatever.com
这是 SignerInfo 的序列号:
841:d=12 hl=2 l= 1 prim: INTEGER :00
这与 X509 证书的序列号匹配:
77:d=6 hl=2 l= 0 prim: INTEGER :00
那么为什么找不到签名证书?
答案1
我生成了自己的自签名证书来测试这一点,但没有得到同样的错误。比较我工作的 PKCS#7 对象和您不工作的 PKCS#7 对象的 ASN.1 结构,我看到的区别如下:
- 您的签名证书已于 2013-06-04 到期
- 您的 PKCS#7 对象的签名属性包含一个
id-aa-signingCertificateV2
属性,而我的没有。 - 我的 PKCS#7 对象的签名属性包含
signingTime
和S/MIME Capabilities
属性,而您的没有。
我最好的猜测是,在寻找签名者证书时忽略了过期的证书,从而导致了错误。
答案2
您对“无法找到签名者证书”消息有什么不明白的地方?您的签名消息不包含证书。
或者,也许您不明白“cms -verify”命令的作用。它不验证消息的完整性,而是验证真实性,为此,它需要证书。