Что нового

Как передать параметр в виде номера сертификата для подписания документа

srg777

Новичок
Сообщения
21
Репутация
1
Всем здрасте!
Как-то мне уже помогли добрые люди на этом форуме сделать код для подписания запроса.
Global $sExe = @ScriptDir & '\csptest.exe', _
$sXml = @ScriptDir & '\request.xml', $sSign = @ScriptDir & '\request.sign', _
$sXmlLast = @ScriptDir & '\request_last_working.xml', $sSignLast = @ScriptDir & '\request_last_working.sign', _
$sXmlREG = @ScriptDir & '\Register\in\request.xml', $sSignREG = @ScriptDir & '\Register\in\request.sign', _
$sCurrTime = @YEAR&'-'&@MON&'-'&@MDAY&'___'&@HOUR&'.'&@MIN&'.'&@SEC, _
$sEmail = '[email protected]', $iExitCode,$iExitCodee, $hProcess, $sRead
$iExitCode = RunWait('"' & $sExe & '"' & ' -sfsign -sign -detached -add -in ' & '"' & $sXml & '"' & ' -out ' & '"' & $sSign & '"' & ' -my ' & $sEmail, '', @SW_HIDE)
ConsoleWrite('Exit code: ' & $iExitCode & @LF)
И все работает.
Но теперь у меня на компьютере появились еще электронные подписи. И Больше это не работает. Так как нужно выбрать номер подписи, а как?

Если я запускаю через bat файл строку csptest.exe -sfsign -sign -detached -add -in X:\REQUEST.xml -out Х:\REQUEST.xml.sign -my [email protected], то меня консоль спрашивает :
enter certificate number:
Я ввожу номер 0, например, и он выбирает этот сертификат и подписывает.

Можно ли этот номер как-то передать автоматически? Сама программа csptest этого делать не умеет. Может avtoit умеет? Может через какой-нибудь consolewrite или read?

Не стал свой вопрос задавать в столе заказов, так как не уверен, что он туда подходит.

Очень надеюсь на Вашу помощь. Всем заранее спасибо.
 
Автор
S

srg777

Новичок
Сообщения
21
Репутация
1
Разобрался. Оказывается в параметре -my можно указывать не только электронную почту, которая зарегистрирована в электронной подписи. Но также и другие параметры электронной подписи, а именно: инн, огрн, фио, название владельца.
Я в программе csptest в параметре -my вместо почты ввожу огрн и проблема решается.

И не нужно передавать никаких параметров.

Вдруг кому-то это понадобится.
 

nsinel

Новичок
Сообщения
1
Репутация
0
Надо бы добавить, что после -my можно добавлять целый список значений параметров электронной подписи, заключая их в кавычки и разделяя их запятой. Это полезно, когда по одному значению сертификат определяется неоднозначно и приходится использовать их комбинацию.
Допустимый перечень значений параметров содержится в реквизите Subject и его можно увидеть выбрав пункт меню "Состав" программы из комплекта КриптоПро certs.ru.msc, ярлык которой называется Сертификаты.
А вот если происходит продление сертификата с теми же данными владельца, вопроса про номер сертификата не избежать, несмотря на то, что срок старого сертификата истек.
Может кто-то знает, какой параметр при подписании файла задать, чтобы сертификаты с истекшим сроком пропускались?
Сообщение автоматически объединено:

Попробовал решить эту проблему с помощью программы AutoIt, которая, кроме всего прочего, может имитировать нажатие нужной клавиши на клавиатуре. В моем примере это клавиша "0". Необходимость возникла как раз после обновления сертификата ЭП, т.е. все данные идентичны. Если бы можно как-то иметь доступ к дате активации сертификата, то было бы проще. Но соответствующего параметра csptest я не нашел.

Содержание файла XXX.au3, которому из bat-файла передается имя файла для подписания
"C:\Program Files (x86)\AutoIt3\AutoIt3.exe" XXX.au3 %1

Предполагается, что порядковый номер сертификата, который требуется выбрать, имеет номер "0", иначе в операторе Send это значение необходимо поменять или даже сделать параметром. передающимся из bat-файла.

#Include <Date.au3>
Opt("WinTitleMatchMode", 2)

; Запуск приложения
$var1 = "c:\Program Files\Crypto Pro\CSP\csptest.exe -sfsign -sign -detached -add -in " & $CmdLine[1] & " -out " & $CmdLine[1]
$var1 &= '.sig -my "почта","фамилия","адрес"'
; почта, фамилия, адрес - естественно должны быть не условными, а из состава сертификата

Run($var1)

; Ожидание 10 секунд до появление окна приложения
$hWnd = WinWait("[Title:csptest]", "", 10)
If Not $hWnd Then
MsgBox(4096, 'Сообщение', 'Окно КриптоПро № 1 не найдено, завершаем работу скрипта')
Exit
EndIf

; Высылает строку символов в элемент
Send("0{ENTER}")
;Sleep(3000)

; Возможно следующие операторы лишние
$hWnd = WinWait("[Title:csptest]", "", 10)
If Not $hWnd Then
MsgBox(4096, 'Сообщение', 'Окно КриптоПро № 2 не найдено, завершаем работу скрипта')
Exit
EndIf
Send("0{ENTER}")

; Закрывает приложение.
;WinClose($hWnd)
 
Последнее редактирование:
Верх