Подпись НАЙС.ОС, проверяемая КриптоПро на 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 вывел 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 и поддержка всех допустимых профилей ГОСТ. Эти вопросы изучаются отдельно.