OpenSSL: невозможно получить сертификат локального эмитента
У меня есть сертификат C.pfx, который мне дал работать с OpenSSL. Сертификат C.pfx имеет следующий путь сертификации: C- > B- > A
Я преобразовал C.pfx в PEM, используя следующую команду:
openssl pkcs12 -in C.pfx -out C.pem -nodes - РАБОТАЕТ ОК
Я открыл сертификат C.pem в редакторе файлов и увидел, что он имеет как RSA ЧАСТНЫЕ КЛЮЧИ, так и СЕРТИФИКАТ.
Я также вижу оба сертификата A и B, установленные в магазине Trusted Roor Certification Athorities в Windows XP.
Цель состоит в подписании, шифровании, расшифровке и проверке тестового файла с использованием OpenSSL для Windows версии 1.0.1c (в настоящее время это последняя версия)
Я использую следующие команды:
- В ЗНАК -
openssl smime -sign -signer C.pem -in test.txt -out test.tmp -- WORKS OK
- К ENCRYPT -
openssl smime -encrypt -in test.tmp -out test.enc C.pem -- WORKS OK
- ПОРАЖЕНИЕ -
openssl smime -decrypt -in test.enc -recip C.pem -inkey C.pem -out test1.tmp -- WORKS OK
- ПРОВЕРИТЬ -
openssl smime -verify -in test1.tmp -CAfile "C.pem" -out notes1.txt -- FAILS
Я использовал консоль MMC для экспорта сертификатов B и A в файлы CER, а затем преобразовал их в PEM с помощью OpenSSL. После этого я попробовал следующие 2:
openssl smime -verify -in test1.tmp -CAfile "A.pem" -out notes1.txt -- FAILS
openssl smime -verify -in test1.tmp -CAfile "B.pem" -out notes1.txt -- FAILS
Все 3 попытки выполнить ПРОВЕРКУ произошли с ошибкой:
Verification failure
3672:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:.\crypt
o\pkcs7\pk7_smime.c:342:Verify error:unable to get local issuer certificate
Что я делаю неправильно?
Ответы
Ответ 1
Когда вы используете openssl smime verify
, попытки openssl проверить, что сертификат, которому он должен пользоваться, доверяется проверкой его подписи (подпись в сертификате, а не подпись в подписанном сообщении, которое вы просили проверить). Для этого у него должна быть копия сертификата для ключа CA, выдавшего сертификат.
Параметр -CAfile
используется для передачи имени файла, содержащего этот сертификат CA, а не сертификата ключа, используемого для подписания сообщения. Вы должны указать certficiate ключа, используемого для подписания сообщения с параметром -certfile
... но в вашем случае сертификат будет находиться в файле test.tmp
(вы можете его подавить, указав -nocerts
, когда вы подписываете сообщение).
Чтобы подавить проверку сертификата ключа при проверке сообщения, вы можете указать параметр -noverify
для команды проверки (хотя openssl smime verify -noverify
выглядит немного странно).