КриптоПРО: Bat файл создания ЭЦП

Сегодняшнюю небольшую запись я решил посветить теме создания электронной цифровой подписи средствами криптопровайдера «КриптоПРО». Речь пойдет о Bat файле, который можно будет использовать для автоматизации подписи электронных документов.

Для того что бы автоматизировать процесс подписывания электронных документов нам понадобится:
1) Крипто-ПРО CSP;
2) USB Ключ (например рутокен), вставленный в USB порт;
3) Блокнот (Notepad.exe);
4) Установленные сертификаты для Вашего ключа;

Камнем преткновения во всей этой истории является файл csptest.exe который находится в директории КриптоПро (по умолчанию C:\Program Files\Crypto Pro\CSP\csptest.exe).

Откроем командную строку и выполним команду:

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
  -alg     Hash 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 — Запускает программу;

Запись опубликована в рубрике Другие языки и технологии с метками , , , , , , , , , , . Добавьте в закладки постоянную ссылку.