openssl cms找不到签署者证书

所以我创build了一个PKCS7签名的消息,并试图用OpenSSL用以下命令validation它:

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的输出openssl asn1parse -in demo.p7m -i -inform DER

http://pastebin.com/AgkVbQjS

这里是base64编码的PKCS7:

http://pastebin.com/92mMPVw6

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----- 

cert可以很好地parsingopenssl 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 

那为什么不find签名证书?

我生成了自己的自签名证书来testing这个,但是我没有得到相同的错误。 比较我工作的PKCS#7对象和不工作的对象的ASN.1结构,我看到的差异是:

  • 您的签名证书在2013年6月4日过期
  • 您的PKCS#7对象的签名属性包含一个id-aa-signingCertificateV2属性,而我没有。
  • 我的PKCS#7对象的签名属性包含了您的签名属性的签名signingTimeS/MIME Capabilities属性。

我最好的猜测是过期的证书在查找签名者证书时被忽视,导致错误。

你在“无法find签署者证书”消息中不理解什么? 您的签名邮件不包含证书。

或者,也许你不明白,什么是“cms -verify”命令呢。 它不完整的消息,它validation的真实性,为此,它需要一个证书。