Подпишете файл и потвърдете с OpenSSL

Имам някои затруднения да разбера процеса на подписване и проверка с openSSL.

Имам малка йерархия от сертификати: root cert => sub cert => end entity cert. Искам да имам сертификат за подписване на код от CA на крайния обект и по този начин създадох двойка ключове и поисках 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

Вашето описание е малко объркващо; Тълкувам, че „CA на краен субект“ означава CA, който издава EE сертификати, тъй като EE не е CA и CA не е 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 и Openssl проверка с верижен CA и верижен сертификат (разкриване: мое).

  • вземете публичния ключ от листовия сертификат с 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