Перейти к содержанию

Электронная подпись ГОСТ: создание и проверка

В НАЙС.ОС подпись ГОСТ можно сформировать через openssl dgst с закрытым ключом ГОСТ Р 34.10 и соответствующим хэш-алгоритмом ГОСТ Р 34.11. Проверка выполняется открытым ключом из файла или сертификата.

Подготовка файлов

umask 077
mkdir -p ~/gost-lab/sign && cd ~/gost-lab/sign
printf 'Документ для проверки ГОСТ\n' > contract.txt
openssl genpkey -algorithm gost2012_256 \
  -pkeyopt paramset:TCA -out signer.key
openssl pkey -in signer.key -pubout -out signer.pub

Подпись ГОСТ 2012/256 + Стрибог-256

openssl dgst -md_gost12_256 \
  -sign signer.key -out contract.sig contract.txt

Файл contract.sig — бинарная подпись; не пытайтесь интерпретировать его как текст.

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

openssl dgst -md_gost12_256 \
  -verify signer.pub -signature contract.sig contract.txt

Ожидаемый результат: Verified OK. После изменения хотя бы одного байта проверка должна завершиться неуспешно.

cp contract.txt modified.txt
printf 'неавторизованное изменение\n' >> modified.txt
openssl dgst -md_gost12_256 \
  -verify signer.pub -signature contract.sig modified.txt

Подпись ГОСТ 2012/512 + Стрибог-512

openssl genpkey -algorithm gost2012_512 \
  -pkeyopt paramset:A -out signer512.key
openssl pkey -in signer512.key -pubout -out signer512.pub
openssl dgst -md_gost12_512 -sign signer512.key \
  -out contract512.sig contract.txt
openssl dgst -md_gost12_512 -verify signer512.pub \
  -signature contract512.sig contract.txt

Подпись бинарного файла

openssl dgst -md_gost12_256 -sign signer.key \
  -out archive.sig firmware.tar.gz
openssl dgst -md_gost12_256 -verify signer.pub \
  -signature archive.sig firmware.tar.gz

Имя firmware.tar.gz — пример; используйте свой реальный файл. Подпись привязана к содержимому, а не к имени.

Передать подпись в текстовом виде

openssl base64 -A -in contract.sig -out contract.sig.b64
openssl base64 -d -A -in contract.sig.b64 -out restored.sig
cmp contract.sig restored.sig

Base64 не шифрует данные; это только текстовая упаковка бинарной подписи.

Открытый ключ из сертификата

openssl x509 -in signer.crt -pubkey -noout > signer-from-cert.pub
openssl dgst -md_gost12_256 -verify signer-from-cert.pub \
  -signature contract.sig contract.txt

signer.crt должен содержать сертификат именно используемой пары ключей. При проверке подписи отдельно проверяйте доверенную цепочку, срок действия, допустимое использование ключа и статус сертификата: успешная математическая проверка подписи ещё не равна полной проверке электронной подписи в документообороте.

Проверка большого файла и контроль воспроизводимости

openssl dgst -md_gost12_256 contract.txt
sha256sum contract.txt                 # независимый не-ГОСТ контроль файла
stat -c '%s байт' contract.txt

Храните исходные байты, подпись, сертификат проверяющего профиля и сведения об алгоритме. Для форматов с присоединённой подписью (CMS) применяйте отдельную процедуру.

Ошибки и интерпретация

Симптом Причина
Verification failure Данные, подпись или открытый ключ не совпадают
unable to load key Неправильный формат или пароль контейнера
unsupported ГОСТ-профиль не загружен или операция недоступна в выбранном API
Проверка проходит, но документ не принимают Не тот профиль сертификата, OID, формат подписи или цепочка доверия

Продолжение: сертификаты, CMS, ключи.