Назад | Перейти на главную страницу

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

Вот PKCS7 в кодировке base64:

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

Это соответствует DN издателя в SignerInfo:

  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

Так почему же он не находит сертификат подписи?

Я создал свой собственный самозаверяющий сертификат, чтобы проверить это, но не получил той же ошибки. Сравнивая структуры ASN.1 моего рабочего объекта PKCS # 7 и вашего неработающего, я заметил следующие различия:

  • Срок действия вашего сертификата для подписи истек 4 июня 2013 г.
  • Подписанные атрибуты вашего объекта PKCS # 7 содержат id-aa-signingCertificateV2 атрибут, которого у меня нет.
  • Подписанные атрибуты моего объекта PKCS # 7 содержали signingTime и S/MIME Capabilities атрибуты, которых у вас нет.

Я предполагаю, что просроченный сертификат не был учтен при поиске подписывающих сертификатов, что привело к ошибке.

Что вы не понимаете в сообщении «не удается найти сертификат подписавшего»? Ваше подписанное сообщение не содержит сертификата.

Или, может быть, вы не понимаете, что делает команда "cms -verify". Он не очень проверяет целостность сообщения, он проверяет подлинность, а для этого нужен сертификат.