Сегодняшнюю небольшую запись я решил посветить теме создания электронной цифровой подписи средствами криптопровайдера «КриптоПРО». Речь пойдет о Bat файле, который можно будет использовать для автоматизации подписи электронных документов.
Для того что бы автоматизировать процесс подписывания электронных документов нам понадобится:
1) Крипто-ПРО CSP;
2) USB Ключ (например рутокен), вставленный в USB порт;
3) Блокнот (Notepad.exe);
4) Установленные сертификаты для Вашего ключа;
Камнем преткновения во всей этой истории является файл
Откроем командную строку и выполним команду:
cd C:\Program Files\Crypto Pro\CSP\ и csptest
Мы увидим все возможные параметры данного exe файла.
select [global options] from: -help print this help -noerrorwait do not wait for any key on error -notime do not show time elapsed -pause Wait for keyboard input after completion so that you may check memory and other resources usage -reboot Call DestroyCSProvider() of last used CSP at exit Services (cryptsrv*, HSM, etc) not affected -randinit <x> Initialize system rng with srand(x) (default: time) -showrandinit Show system rng initialization value -stack Measure stack usage select [mode] from: -lowenc low level encryption/decryption test -sfenc simplified level message encryption/decryption test -cmslowsign CMS low level message signing test -cmssfsign CMS simplified level message signing/verifying test -lowsign low level message signing test -lowsignc low level message signing test with cycle Use '-lowsign -repeat NN' instead! -sfsign simplified level message signing/verifying test -ipsec ipsec tests -defprov default provider manipulations -testpack Pack of several tests -property certificate obtain/install property for secret key linking -certkey change provider name in certificate secret key link -context provider context tests -absorb absorbs all certs from containers with secret key linking -drvtst proxy-driver test -signtool SDK signtool analog -iis manage IIS -hsm manage HSM-client -rpcc RPC over SSL client -rpcs RPC over SSL server -oid oid info/set/get -passwd set/change password -keycopy copy container -keyset create (open) keyset -tlss start tls server -tlsc start tls client -tls TLS tests -prf PRF tests -hash hash test -makecert certificate issuing test -certprop show certificate properties -rc verify pkcs#10/certificate signature -cmsenclow CMS low level message encryption/decryption test -sfse simplified level message SignedAndEnveloped test -stress stress test for Acquire/ReleaseContext -ep public key export test -enum CSP parameters enumeration -cpenc CP/Crypto level (advapi32) encryption tests -setpp SetProvParam tests -perf Performance tests -speed Speed tests and optimal function mask setting -testcont Install/Uninstall test containers -install CSP installation information, clearing out CSP -version Print CSP version
Для того, что бы увидеть параметры той или иной глобальной опции, достаточно вызвать данный файл с этой опцией, например
csptest -sfsign
выдаст
<commands>: -sign Sign data from input filename -verify Verify signature on data specified by input filename -help Print this help <options>: -in <file> Input filename to be signed or verified -out <file> Output PKCS#7 filename -my <DName> Cert from CURRENT_USER store to process data -MY <DName> Cert from LOCAL_MACHINE store to process data -detached Deal with detached signature -add Add sender certificate to PKCS#7 -signature <file> Detached signature file -algHash algorithm: SHA1, MD5, MD2, GOST - default -ask Acquire csp context using my cert (default: none) -base64 Input/output with base64<->DER conversion -addsigtime Add signing time attribute -cades_strict Strict signingCertificateV2 attribute generation -cades_disable Disable signingCertificateV2 attribute generation
Таким образом, чтобы подписать файл через cmd средствами csptest.exe нужно вызвать команду:
csptest -sfsign -sign -in Dogovor.doc -out Dogovor.doc.sig -my ООО МоиПрограммы Иванов Иван Иванович
где:
-my — Указывает владельца ключа;
-in — Указывает какой файл нужно подписывать. Если файл находится не в папке с csptest то нужно указывать полный путь.;
-out — Указывает имя файла подписи;
Проверить подпись можно на сайте Госулсуг по
Скорей всего. Если сейчас загрузить данный файл на сайте госуслуги, то появится ошибка. Вызвано это тем, что необходима информация об удостоверяющем центре. Так же не будет лишней дата и время подписи документов. Для этого к нашей команде нужно добавить два параметра:
csptest -sfsign -sign -in Dogovor.doc -out Dogovor.doc.sig -my ООО МоиПрограммы Иванов Иван Иванович -addsigtime -add
Если же нам нужна подпись в осоединенном формате, то добавим еще один параметр:
csptest -sfsign -sign -in Dogovor.doc -out Dogovor.doc.sig -my ООО МоиПрограммы Иванов Иван Иванович -addsigtime -add -detached
Примечание:Если подпись документа выполняется с ошибкой
Unable to open file
An error occurred in running the program.
.\signtsf.c:321:Cannot open input file.
Error number 0x2 (2).
Не удается найти указанный файл.
при вызове, как в последнем примере, и Вы уверены в правильности путей в параметре -in и -out, попробуйте создать подпись по первому примеру, а после выполнить команду с полным набором параметров!!!
Основную команду для подписи мы получили. Теперь немного упростим процедуру. Сделаем bat файл, при запуске которого будет подписывать файл Secret.txt, находящийся в тойже папке что и bat файл. Откроем блокнот и запишем слудующий код:
chcp 1251 set CurPath=%cd% cd C:\Program Files\Crypto Pro\CSP call csptest -sfsign -sign -in %CurPath%\Secret.txt -out %CurPath%\Secret.txt.sig -my ООО МоиПрограммы Иванов Иван Иванович -addsigtime -add -detached cd %CurPath%
Нажимаем «Файл» -> «Сохранить как» -> ЗадаемИмя с .bat -> «Сохранить»
Собсвенно и все. Для справки:
chcp 1251 — Задает кодировку для CMD. Необходимо для валидной обработки русских букв в коде;
set CurPath=%cd% — Сохраняет путь текущей директории CMD в переменную CurPath;
cd — Задает текущий путь CMD;
call — Запускает программу;