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

Проверка подписи КриптоПро в НАЙС.ОС

Проверено 24 октября 2026 года: на macOS CryptCP 5.0 создана отсоединённая подпись, а на НАЙС.ОС GPGSM проверил её с результатами GOODSIG и VALIDSIG. При изменении исходного файла получено BADSIG, код 2. При последующих штатных запусках GPGSM выдал TRUST_FULLY, код 0.

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

Создайте нейтральное сообщение без коммерческой тайны и персональных сведений:

mkdir -p "$HOME/niceos-gost-interop"
printf 'NICEOS-CRYPTOPRO-INTEROP-TEST-001\n' \
  > "$HOME/niceos-gost-interop/test.txt"
shasum -a 256 "$HOME/niceos-gost-interop/test.txt"

Для продукционного квалифицированного сертификата на Рутокене создание подписи имеет юридические последствия. Для лаборатории используйте отдельный учебный ГОСТ-сертификат. В подтверждённом опыте проверялся настоящий сертификат российской инфраструктуры; сам ключ не передавался на Linux.

Испытанная команда использовала функцию CryptCP -signf для создания .sgn, опции -detached, -der, -cert, выбор сертификата по отпечатку. Порядок и доступность опций зависят от версии CryptCP. В данной версии cryptcp -help -signf возвращал 0x200000CA («лишняя команда»), что не являлось ошибкой подписи. Общую справку предоставляет cryptcp -help.

Если для лабораторного ключа доступны эти параметры, пример:

CRYPTCP=/opt/cprocsp/bin/cryptcp
THUMBPRINT='ОТПЕЧАТОК_УЧЕБНОГО_СЕРТИФИКАТА'
mkdir -p "$HOME/niceos-gost-interop/sign"

"$CRYPTCP" -signf -detached -der -cert \
  -thumbprint "$THUMBPRINT" \
  -dir "$HOME/niceos-gost-interop/sign" \
  "$HOME/niceos-gost-interop/test.txt"

Пример предназначен для тестового ключа; подтвердите поддержку параметров на своей версии до автоматизации. Если команда не подходит, подпишите через графические «Инструменты КриптоПро» и экспортируйте отсоединённый CMS в DER.

Перенос и проверка в НАЙС.ОС

Передайте test.txt, .sgn и, если нужно, только открытый .cer. Не передавайте ключи и PIN. В НАЙС.ОС сертификат КриптоПро уже был импортирован через gpgsm --import, при этом GPGSM распознал его ключ и профиль ГОСТ-2012/256.

cd /root/gost-cms-test

gpgsm --status-fd 2 --verbose \
  --verify test.txt.sgn test.txt \
  > verify.log 2>&1
rc=$?
echo "Код проверки: $rc"
grep -oE '\[GNUPG:\] (GOODSIG|VALIDSIG|BADSIG|TRUST_[A-Z_]+)' \
  verify.log || true

В лабораторном опыте было зафиксировано GOODSIG + VALIDSIG. Отображаемое GPGSM имя кривой GOST2001-CryptoPro-A относится к математическим параметрам кривой; в X.509 оригинала поля Signature Algorithm и Public Key Algorithm использовали ГОСТ-2012/256. Нельзя заключать о переходе сертификата на алгоритм ГОСТ-2001 только по внутреннему текстовому имени кривой.

Обязательный отрицательный тест

cp test.txt test-modified.txt
printf 'CHANGED\n' >> test-modified.txt

gpgsm --status-fd 2 \
  --verify test.txt.sgn test-modified.txt \
  > verify-modified.log 2>&1
rc=$?
echo "Код проверки изменённого: $rc"
grep -oE '\[GNUPG:\] (GOODSIG|VALIDSIG|BADSIG|ERRSIG)' \
  verify-modified.log || true

Фактически наблюдалось BADSIG и код 2. Не используйте только внешнее «подпись выполнена»: контроль подмены показывает, что приложение действительно связывает подпись с исходным содержимым.

Доверие — отдельный критерий

Сначала Dirmngr сообщил Синтаксическая ошибка в URI, после настройки окружения проверка в обычном режиме (без отключения CRL и политик) завершилась кодом 0 с TRUST_FULLY. Точная причина первоначальной ошибки не установлена. Успех уже заполненного кэша не доказывает прохождение проверки с чистым кэшем и не заменяет регламент проверки подписи КЭП. Подробности — в руководстве по доверию.