Сегодняшнюю небольшую запись я решил посветить теме создания электронной цифровой подписи средствами криптопровайдера «КриптоПРО». Речь пойдет о 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 — Запускает программу;