openssl cms 未找到签名者证书

openssl cms 未找到签名者证书

因此我创建了一个 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

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

该证书可以很好地进行解析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 对象的签名属性包含signingTimeS/MIME Capabilities属性,而您的没有。

我最好的猜测是,在寻找签名者证书时忽略了过期的证书,从而导致了错误。

答案2

您对“无法找到签名者证书”消息有什么不明白的地方?您的签名消息不包含证书。

或者,也许您不明白“cms -verify”命令的作用。它不验证消息的完整性,而是验证真实性,为此,它需要证书。

相关内容