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

Подпись НАЙС.ОС, проверяемая КриптоПро на macOS

Проверено 24 октября 2026 года: GPGSM НАЙС.ОС сформировал отсоединённую ГОСТ-подпись, и CryptCP 5.0 на macOS принял её с кодом 0. После изменения исходного файла CryptCP вернул «Неправильная подпись» и ненулевой код. Это независимое подтверждение обратного направления обмена CMS SignedData.

Лабораторные особенности проведённого опыта

Использован отдельно созданный короткоживущий самоподписанный сертификат NiceOS GnuPG interoperability test CA. У него было CA:TRUE, Digital Signature, Certificate Sign, CRL Sign. Профиль создан специально для воспроизводимого опыта с самоподписью и не является образцом оформления конечного пользовательского сертификата. Срок действия составлял 7 суток.

GPGSM подписывал тестовый текст на стороне Linux; на Mac не было закрытого ключа подписанта. При проверке использовались -nochain и -f signer.cer, то есть проверялось соответствие подписи представленному лабораторному сертификату, а не полноценная цепочка доверия УЦ.

Подготовка лабораторной подписи на НАЙС.ОС

Предпосылка: отдельная тестовая ГОСТ-пара именно для подписи (digitalSignature), доступная GPGSM через P12. Не используйте ключ из учебного примера шифрования без проверки его назначения: тот сертификат намеренно создан для keyAgreement / keyEncipherment и не является подходящим универсальным примером подписанта.

В успешно выполненном опыте тестовый подписант был подготовлен из уже существующего лабораторного test.key с помощью OpenSSL:

umask 077
D='/каталог/отдельной/лабораторной/пары'
E='/каталог/обмена'
mkdir -p "$E"

OPENSSL_CONF=/dev/null openssl req -engine gost \
  -new -x509 -key "$D/test.key" -out "$E/signer.pem" \
  -subj '/C=RU/O=NiceSOFT Test/CN=NiceOS GnuPG interoperability test CA' \
  -days 7 \
  -addext 'basicConstraints=critical,CA:TRUE' \
  -addext 'keyUsage=critical,digitalSignature,keyCertSign,cRLSign' \
  -addext 'subjectKeyIdentifier=hash'

CA:TRUE здесь описывает исторически выполненный лабораторный тест, а не рекомендацию создавать CA для рядовых пользователей. Для нового долгоживущего стенда лучше использовать отдельный учебный УЦ и подписанный им конечный сертификат, тогда можно раздельно испытывать цепочку доверия и математическую проверку. Чтобы выполнить подпись GPGSM, соответствующий секретный ключ test.key должен быть импортирован в тот же изолированный --homedir через защищённый тестовый P12 по методике импорта. Не передавайте test.key и P12 на Mac.

umask 077
H='/путь/к/изолированному/gnupg'
E='/путь/к/папке/exchange'
FPR='ПОЛНЫЙ_SHA1_ОТПЕЧАТОК_ТЕСТОВОГО_СЕРТИФИКАТА'
mkdir -p "$E"

printf 'NiceOS GnuPG -> CryptoPro interoperability test\n' \
  > "$E/message.txt"

gpgsm --homedir "$H" \
  --local-user "$FPR" \
  --include-certs -1 \
  --output "$E/message.txt.sgn" \
  --detach-sign "$E/message.txt"

В конкретном опыте при создании лабораторной подписи применялись --batch --pinentry-mode loopback --passphrase-fd 3, а также --disable-crl-checks --disable-policy-checks. Эти опции не являются рекомендуемой конфигурацией производственной подписи, особенно для юридически значимого документооборота; их применение обязательно отмечают в протоколе. В иных настройках gpg-agent может запросить пароль через Pinentry.

Проверьте результат локально:

gpgsm --homedir "$H" --status-fd 2 \
  --verify "$E/message.txt.sgn" "$E/message.txt"

В выполненном опыте GPGSM вывел GOODSIG, VALIDSIG, TRUST_FULLY — с учётом тестового доверия к собственному сертификату.

Экспортируйте только общеизвестные файлы

В каталог обмена включают искусственный текст, отсоединённую подпись .sgn и открытый сертификат в DER .cer:

openssl x509 -in "$E/signer.pem" -outform DER \
  -out "$E/signer.cer"

( cd "$E" && sha256sum \
    message.txt message.txt.sgn signer.cer > SHA256SUMS )

signer.pem в этой команде — сертификат, а не файл закрытого ключа. Проверяйте содержимое до упаковки. Не архивируйте test.key, password.txt, .p12, private-keys-v1.d и весь GnuPG home.

Проверка в CryptCP 5.0 на macOS

Распакуйте файлы в отдельный каталог. До криптографической проверки подтвердите контрольные суммы: shasum -a 256 -c SHA256SUMS.

CRYPTCP=/opt/cprocsp/bin/cryptcp

"$CRYPTCP" -verify -detached \
  -f signer.cer -nochain \
  message.txt message.txt.sgn

echo "Код завершения: $?"

Наблюдение: CryptCP показал «Подпись проверена», [ErrorCode: 0x00000000], код 0. Затем был испытан изменённый документ:

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

"$CRYPTCP" -verify -detached \
  -f signer.cer -nochain \
  message-modified.txt message.txt.sgn

echo "Код завершения: $?"

Наблюдение: «Неправильная подпись», [ErrorCode: 0x200001f9], ненулевой код 249 (последнее число — сокращённый до диапазона Unix exit status результат). Отрицательный тест пройден.

Граница доказательства

Здесь подтверждены кодирование и независимая математическая проверка подписи, созданной GPGSM. Не подтверждены цепочка промышленного УЦ, OCSP/CRL для этого самоподписанного CA, наличие отметки доверенного времени, форматы CAdES-T/LT/A и поддержка всех допустимых профилей ГОСТ. Эти вопросы изучаются отдельно.