Статус: Новичок
Группы: Участники
Зарегистрирован: 09.04.2021(UTC) Сообщений: 2
|
Спасибо за ответ. Цитата:Очевидна только одна проблема - если у Вас несколько процессов NodeJS проводят валидацию параллельно, то они должны использовать разные папки или разные имена файлов, чтобы в процессе проверки разные подписи не смешивались и не давали ошибки. Да, у нас для валидации каждой подписи формируется отдельная временная папка. Цитата:Раз уж у Вас NodeJS, может быть там получится использовать проверку Raw подписи через плагин и Javascript? На этот плагин я смотрел, но насколько я понял, он под капотом использует CryptoPro Browser-PlugIn, который просто так на NodeJS, не завести, т.к. это именно браузерный плагин. Цитата:есть ответ 4 года назад что cryptcp не подходит, можете использовать csptest или за 5 минут сделать свою утилиту Подскажите пожалуйста, что имеете ввиду под "за 5 минут сделать свою утилиту"? Разве подпись сформированную по ГОСТу можно без криптопровайдера проверить? Попробовал проверить подпись через csptest, но судя по всему застрял на переводе Base64-подписи в DER. Поясню:
- Сохраняю Base64-содержимое сертификата в файл cert.cer
- Сохраняю каноникализированный <SignedInfo> в файл signedInfo.xml
- Декодирую из Base64 содержимое тега <SignatureValue>, сохраняю в файл signedInfo.xml.sng
- Выполняю команду:
Код:csptest.exe -keys -verify GOST12_256 -in C:\sig-test\1\signed-info.xml -signature C:\sig-test\1\signed-info.xml.sgn -keytype signature -certificate C:\sig-test\1\cert.cer
Получаю в ответ:
Код:CSP (Type:80) v4.0.9019 KC1 Release Ver:4.0.9969 OS:Windows CPU:IA32 FastCode:READY:SSSE3.
AcquireContext: OK. HCRYPTPROV: 21807288
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Public key imported from cert file: C:\sig-test\1\cert.cer
Hash object created with alg: GOST12_256 0x8021
The data buffer has been hashed.
An error occurred in running the program.
ctkey.c:3534:Bad Signature.
Error number 0x80090006 (-2146893818).
Неправильная подпись.
Total: SYS: 0,031 sec USR: 0,047 sec UTC: 0,176 sec
[ErrorCode: 0x80090006]
Попробовал пойти в обратном порядке, сделал следующие действия:
- Сформировал тестовый сертификат для подписи, сохранил в локальном хранилище, публичный ключ экспортировал в файл test-signer.cer
- Выполняю команду:
Код:csptest.exe -keys -sign GOST12_256 -in C:\sig-test\1\signed-info.xml -out C:\sig-test\1\signed-info.xml.self-signed.sgn -keytype signature -cont default
- Выбираю контейнер со сформированным сертификатом для подписи.
- В ответ получаю:
Код:CSP (Type:80) v4.0.9019 KC1 Release Ver:4.0.9969 OS:Windows CPU:IA32 FastCode:READY:SSSE3.
AcquireContext: OK. HCRYPTPROV: 13710280
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Container name: "58401f2db-2059-b990-d56b-e2ab0af28cf"
Signature key is available. HCRYPTKEY: 0xd2ffb0
Hash object created with alg: GOST12_256 0x8021
The data buffer has been hashed.
Signature length 64 found.
Signature was done.
Output file (C:\sig-test\1\signed-info.xml.self-signed.sgn) has been saved
Signature saved into file C:\sig-test\1\signed-info.xml.self-signed.sgn
Keys in container:
signature key
Extensions:
OID: 1.2.643.2.2.37.3.9
PrivKey: Not specified - 15.07.2022 16:39:41 (UTC)
Total: SYS: 0,438 sec USR: 0,219 sec UTC: 6,106 sec
[ErrorCode: 0x00000000]
- Проверяю сформированную только что подпись:
Код:csptest.exe -keys -verify GOST12_256 -in C:\sig-test\1\signed-info.xml -signature C:\sig-test\1\signed-info.xml.self-signed.sgn -keytype signature -certificate C:\sig-test\1\test-signer.cer
- В ответ получаю:
Код:CSP (Type:80) v4.0.9019 KC1 Release Ver:4.0.9969 OS:Windows CPU:IA32 FastCode:READY:SSSE3.
AcquireContext: OK. HCRYPTPROV: 16274368
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Public key imported from cert file: C:\sig-test\1\test-signer.cer
Hash object created with alg: GOST12_256 0x8021
The data buffer has been hashed.
Signature was verified OK
Total: SYS: 0,031 sec USR: 0,047 sec UTC: 0,134 sec
[ErrorCode: 0x00000000]
Т.е. подпись сформировал и проверил, вроде бы все ок. Дальше пытаюсь проверить эту подпись в контексте всего XML-документа.
- В исходном XML-файле заменяю сертификат на содержимое файла test-signer.cer
- Содержимое файла с полученной подписью (signed-info.xml.self-signed.sgn) кодирую в Base64, и помещаю в элемент <SignatureValue>
- Полученный файл пытаюсь проверить через https://dss.cryptopro.ru/Verify/ - получаю ошибку. Как уже писал ранее, исходный XML через данный сервис проверяется корректно.
При этом в моем понимании, так как подпись формируется только на SignedInfo, а он у меня остался неизменным, то такая "ручная подмена" подписи и сертификата должны сработать. Если так, то в итоге могу предположить что где-то на этапе преобразования подписи в Base64 что-то идет не так. Либо где-то не соответствуют алгоритмы подписания, хотя я везде использовал GOST 2012 256, как указано в алгоритмах из <SignedInfo>
|