Подпишите файл и проверьте с помощью OpenSSL

Мне сложно понять процесс подписи и проверки с помощью openSSL.

У меня есть небольшая иерархия сертификатов: корневой сертификат => вспомогательный сертификат => сертификат конечного объекта. Я хочу получить сертификат подписи кода от ЦС конечного объекта и, таким образом, создал пару ключей и запросил CSR:

openssl genrsa -out key.pem
...
openssl genrsa -pubout -in key.pem -out key.pub.pem
...
openssl req -new -sha256 -key key.pem -out id.csr
...

Я отправляю свой CSR и получаю сертификат подписи кода, хранящийся в cert.pem. Насколько я понимаю, этот сертификат используется только для проверки (проверка подписи), и мой код должен быть подписан закрытым ключом (key.pem):

openssl dgst -sha256 -sign key.pem -out program.sign program

Таким образом, у меня есть program.sign, подписанный key.pem. Затем мне нужно проверить эту подпись, учитывая, что у меня есть 4 сертификата для проверки пути: root.pem, sub.pem, end.pem, cert.pem.

Как я могу попросить openssl проверить подпись с несколькими сертификатами в цепочке для проверки?

Я пробовал это, но, конечно, это не работает, потому что я указываю только сертификат подписи кода, без остальной части цепочки:

openssl dgst -sha256 -verify program -signature program.sign cert.pem
undable to load key file

Я что-то упускаю ?

Большое тебе спасибо.


person dvr33    schedule 20.06.2018    source источник


Ответы (1)


В основном дублируйте проверку подписи файла с помощью openssl dgst

Ваше описание немного сбивает с толку; Я интерпретирую, что «ЦС конечного объекта» означает ЦС, который выдает сертификаты EE, поскольку EE не является ЦС, а ЦС не является EE, а то, что вы называете «сертификатом конечного объекта», на самом деле не является сертификат конечного объекта. В частности, я понимаю, что ваш cert.pem является сертификатом, выданным CA, чей сертификат находится в end.pem, с использованием соответствующего закрытого ключа, так что root.pem sub.pem end.pem cert.pem фактически формирует путь сертификации, известный как цепочка.

openssl dgst -verify даже не берет сертификат, а тем более проверяет его. Он принимает только открытый ключ и использует его для проверки подписи на данных - или, необязательно, берет закрытый ключ и извлекает открытый ключ и использует его, но обычно сторона, проверяющая подпись, не делает и не должна есть приватный ключ. Если вы хотите использовать командную строку для проверки подписи по цепочке сертификатов, вам нужно сделать две вещи в любом порядке:

  • используйте openssl verify для проверки цепочки сертификатов; вы можете либо предоставить промежуточные сертификаты, используя -untrusted (в виде одного файла, который в вашем случае cat sub.pem end.pem), либо использовать промежуточные сертификаты (а также корень) в используемом хранилище доверенных сертификатов, которое может быть созданным и указанным вами, или в принципе может быть значением по умолчанию (но это часто является общесистемным и менять его неразумно). См. Проверка цепочки сертификатов с помощью openssl verify и Проверка с помощью цепочки CA и цепочки Cert (раскрытие: мое).

  • получить открытый ключ из листового сертификата с помощью openssl x509 -pubkey -in cert.pem -out pubkeyfile и использовать его для проверки подписи данных, для чего вы должны указать файл данных после параметров или в качестве стандартного ввода, см. ниже.

(Я не могу правильно получить этот формат без этого фиктивного текста)

openssl dgst -sha256 -verify pubkeyfile -signature program.sign program
openssl dgst -sha256 -verify pubkeyfile -signature program.sign <program
person dave_thompson_085    schedule 20.06.2018