Реми ван Элст. Подписание и проверка текстов/файлов публичными ключами с помощью OpenSSL из командной строки, 2015

Перевод статьи: Sign and verify text/files to public keys via the OpenSSL Command Line

Автор: Реми ван Элст (Remy van Elst)

В этом небольшом руководстве рассматривается, как использовать OpenSSL из командной строки для подписания файла и как проверить подпись этого файла. Это делается для того, чтобы доказать владение ключом или чтобы доказать, что файл не был изменён с тех пор, как был подписан. Руководство пригодно и для небольших текстовых файлов, и для больших фотографий, и для документов, и файлов PDF.

1. Создание пары ключей

Сначала создадим новую пару ключей. Можно использовать существующую пару. Измените тему в следующей команде и выполните её, чтобы создать самозаверенную пару ключей:

openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$(whoami)s Sign Key.key" -out "$(whoami)s Sign Key.crt" \
-days 365 -subj "/C=NL/ST=Zuid Holland/L=Rotterdam/O=Sparkling Network/OU=IT Dept/CN=$(whoami)s Sign Key"

Также создадим небольшой текстовый файл для тестирования процесса подписания:

echo "Здравствуй, мир!" > sign.txt

2. Подписание файла

Воспользуемся следующей командой, чтобы подписать файл. На самом деле мы одной командой openssl посчитаем хэш файла по алгоритму sha256 и подпишем его:

openssl dgst -sha256 -sign "$(whoami)s Sign Key.key" -out sign.txt.sha256 sign.txt

В результате получим файл sign.txt с его содержимым и файл sign.txt.sha256 с подписанным хэшем этого файла.

Можно разместить этот файл и публичный ключ ($(whoami)s Sign Key.crt) в интернете или в другом месте. Храните приватный ключ ($(whoami)s Sign Key.key) в безопасности и секретности.

3. Проверка подписи

Для проверки подписи нужен публичный ключ, относящийся к сертификату. Его можно получить из сертификата с помощью следующей команды:

openssl x509 -in "$(whoami)s Sign Key.crt"

Можно избежать этого этапа, объединив два этапа в одной команде. Следующая команда проверяет файл с помощью подписи хэша:

openssl dgst -sha256 -verify <(openssl x509 -in "$(whoami)s Sign Key.crt" -pubkey -noout) -signature sign.txt.sha256 sign.txt

Если содержимое не было изменено с момента подписания, вывод команды будет таким:

Verified OK

Если проверка завершилась неудачно, это означает, что хэш файла не соответствует подписанному хэшу. Весьма вероятно, что файл был изменён или подделан. Результат неудачной проверки выглядит следующим образом:

Verification Failure

4. Подпись

Чтобы получить текстовую версию подписи (файл содержит двоичные данные), можно воспользоваться командой base64. Текстовую версию вместе с файлом проще разместить в интернете:

base64 sign.txt.sha256 > sign.txt.sha256.txt

Для обратного преобразования в формат, пригодный для использования в openssl, воспользуйтесь командой base64 -d:

base64 -d sign.txt.sha256.txt > sign.txt.sha256

Написать автору перевода