Итак, я создал подписанное сообщение 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
:
Вот PKCS7 в кодировке base64:
Сертификат 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 и вашего неработающего, я заметил следующие различия:
id-aa-signingCertificateV2
атрибут, которого у меня нет.signingTime
и S/MIME Capabilities
атрибуты, которых у вас нет.Я предполагаю, что просроченный сертификат не был учтен при поиске подписывающих сертификатов, что привело к ошибке.
Что вы не понимаете в сообщении «не удается найти сертификат подписавшего»? Ваше подписанное сообщение не содержит сертификата.
Или, может быть, вы не понимаете, что делает команда "cms -verify". Он не очень проверяет целостность сообщения, он проверяет подлинность, а для этого нужен сертификат.