Как отформатировать jakarta: Инструкция: как разблокировать jacarta PKI/ГОСТ – Как удалить RSA сертификат с джакарты

Содержание

Инструкция: как разблокировать jacarta PKI/ГОСТ

Носитель Jacarta PKI/ГОСТ блокируется при многочисленных попытках ввести неверный пин-код. При этом теряется связь с сервером ФСРАР, и данные о фактурах не поступают в вашу учетную систему. Как быстро разблокировать ключ и восстановить работу с ЕГАИС? 

 

По умолчанию на всех новых носителях установлены следующие пароли:

 

PKI 11 11 11 11
Администратор PKI  00 00 00 00
ГОСТ 0987654321 
Администратор ГОСТ  1234567890

 

 

 

 

 

 

 

Для снятия блокировки на компьютере должна быть установлена программа Единый клиент Jacarta. Если настройка и установка ЕГАИС производилась нашими специалистами, то эта программа у вас уже есть.

 

Запустите программу и дождитесь, когда в окне Единого клиента появится информация о носителе Jacarta PKI/ГОСТ.

 

Снятие блокировки ГОСТ

В разделе ГОСТ записан сертификат КЭП, выданный в удостоверяющем центре. Будьте внимательны — нельзя удалять из этого раздела какие-либо компоненты. После удаления придется повторно обращаться в удостоверяющий центр для выпуска ключа.

 

jacarta инструкция

 

Чтобы разблокировать пин-код ГОСТ, в верхнем меню “Операции с приложением” выберите первый пункт “Разблокировать PIN-код пользователя”. На экране появится уведомление, что снятие блокировки обнулит счетчик ошибочных попыток ввода.

 

Нажмите “ОК” и во вновь открывшемся окне введите пин-код администратора Jacarta ГОСТ 1234567890. После обнуления счетчика ошибок введите стандартный пин-код пользователя ГОСТ 0987654321. 

 

Важно: эта процедура поможет только скинуть счетчик, но не изменить забытый пароль на новый. Если вы изменили пароль ГОСТ, установленный по умолчанию, и забыли его, придется проводить инициализацию и вновь записывать ключ в удостоверяющем центре.

 

 

Снятие блокировки PKI

В контейнере PKI записан RSA-ключ, который генерируется в личном кабинете на сайте egais.ru. В случае утери пин-кода этот раздел может быть инициализирован (полностью очищен), так как вы можете повторно записать ключ самостоятельно и бесплатно, без обращения в удостоверяющий центр.

 

Для снятия блокировки PKI заходим в соответствующую вкладку в Едином клиенте и выбираем “Разблокировать PIN-код пользователя”. В появившемся окне сначала вводим пин-код администратора Jacarta PKI 000000000, затем дважды указываем новый пин-код пользователя. 

  

Еще статьи по теме «jacarta»:

 

Удаленное подтверждение — экономия на ЕГАИС

 

Оборудование для ЕГАИС

 

Установка программ

Инициализировать

Процедура инициализации подразумевает форматирование памяти устройства. В ходе этого процесса вся хранящаяся на JaCarta информация удаляется, освобождается память, сбрасывается значение пароля. 

Внимание!

Инициализировать JaCarta с электронной подписью, полученный в офисе Удостоверяющего центра, не нужно. Это приведет к уничтожению ЭП!

Перед генерацией ЭП на JaCarta SE (PKI/ГОСТ) или JaCarta LT необходимо выполнить инициализацию носителя.

Инициализация носителя JaCarta SE (PKI/ГОСТ):

  1. Запустите «Единый клиент JaCarta» и переключитесь в режим администрирования.
  2. На вкладке «ГОСТ» нажмите «Инициализировать приложение».
  3. Укажите PIN-код администратора и новый PIN-код пользователя (мы рекомендуем оставить тот, который был установлен по умолчанию).

Инициализация раздела PKI:

  1. Запустите «Единый клиент JaCarta» и переключитесь в режим администрирования.
  2. На вкладке «PKI» нажмите «Инициализировать приложение».
  3. Укажите PIN-код администратора и новый PIN-код пользователя (мы рекомендуем оставить тот, который был установлен по умолчанию).

  4. В окне предупреждения нажмите «Продолжить».

Инициализация носителя JaCarta LT:

  1. Запустите «Единый клиент JaCarta» и переключитесь в режим администрирования.
  2. На вкладке «STORAGE» нажмите «Инициализировать приложение».
  3. Укажите PIN-код администратора и новый PIN-код пользователя (мы рекомендуем оставить тот, который был установлен по умолчанию). Нажмите «Выполнить».

  4. В окне предупреждения нажмите «Продолжить».

Как отформатировать (инициализировать) eToken?

Как отформатировать (инициализировать) eToken?

Как отформатировать (инициализировать) eToken?

Внимание!!! Инициализация удаляет все ЭЦП на Вашем специализированном носителе eToken.

Для инициализации ключа eToken необходимо проделать следующие действия:
1. Вставьте специализированный носитель в компьютер.
2. Откройте приложение eToken Properties. Для этого нажмите ПускВсе программы eTokeneToken PKI Client eToken Properties .


 3. В открывшемся окне программы нажмите кнопку Подробный вид.


4. Выберите свой носитель eToken.


5. Нажмите Инициализировать eToken

 или выделите eToken правой клавишей мыши и выберите из выпадающего списка  пункт Инициализировать.



6. В открывшемся окне укажите Пароль пользователя и Пароль администратора. Также необходимо снять чекбокс При первом входе необходимо изменить пароль. После вода данных нажмите Запуск.

 Примечание. Рекомендуем вводить пароль пользователя с карточки отзыва сертификата,  выданным УЦ.


7. После выполненных действий появится окно об успешном выполнении инициализации, нажмите ОК.


Оставить отзыв

Спасибо за обращение

Ваша заявка принята
Наш специалист свяжется с Вами в течение 30 минут.

Спасибо, что откликнулись!

Благодарим за интерес, проявленный к нашей компании.
Мы свяжемся с вами в ближайшее время.

Спасибо, что подписались!

Теперь вы будете получать письма от Такснета

Спасибо, что оставили отзыв!

Мы уже читаем его, чтобы стать еще лучше.

Делаем JaCarta Editor / Habr

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <TreeViewConstants.au3>
#include <GuiTreeView.au3>
#include <GuiMenu.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
#include <GuiButton.au3>
#NoTrayIcon

;функции из jcFS.dll
Dim $ETSdkDll=DllOpen('jcFS.dll')


Func ETTokenLock($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenLock', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETTokenUnLock($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenUnLock', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc


Func ETReadersEnumOpen()
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETReadersEnumOpen', _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETReadersEnumNext($EnumId)
	Local $Reader=DllStructCreate('CHAR name[260]; BYTE etoken;')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETReadersEnumNext', _
		'DWORD',$EnumId, _
		'PTR',DllStructGetPtr($Reader) _
	)
	Local $Result[2]=[	DllStructGetData($reader,'name'), _
						DllStructGetData($reader,'etoken')]
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:$Result
EndFunc

Func ETReadersEnumClose($EnumId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETReadersEnumClose', _
		'DWORD',$EnumId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETTokenBind($ReaderName)
	Local $In=DllStructCreate('BYTE['&(StringLen($ReaderName)+1)&']')
	Local $Out=DllStructCreate('DWORD')
	DllStructSetData($In,1,$ReaderName)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenBind', _
		'PTR',DllStructGetPtr($Out), _
		'PTR',DllStructGetPtr($In) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETTokenRebind($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenRebind', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETTokenUnbind($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenUnbind', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETTokenLogin($BindId,$Pin='')
	Local $In=DllStructCreate('BYTE['&(StringLen($Pin)+1)&']')
	DllStructSetData($In,1,$Pin)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenLogin', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($In) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETTokenPinChange($BindId,$Pin)
	Local $In=DllStructCreate('CHAR['&(StringLen($Pin)+1)&']')
	DllStructSetData($In,1,$Pin)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenPinChange', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($In) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETTokenLogout($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenLogout', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETRootDirOpen($BindId,$Dir=0xF007)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETRootDirOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$BindId, _
		'DWORD',$Dir _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETDirOpen($Dir,$DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$Dir, _
		'DWORD',$DirId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETDirCreate($Dir,$DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirCreate', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$Dir, _
		'DWORD',$DirId, _
		'DWORD',0 _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETDirGetInfo($DirId)
	Local $Out=DllStructCreate('WORD wDirName; WORD wSize')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirGetInfo', _
		'DWORD',$DirId, _
		'PTR',DllStructGetPtr($Out) _
	)
Local $Result[2]=[	DllStructGetData($Out,'wDirName'), _
						DllStructGetData($Out,'wSize')]

	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:$Result

EndFunc

Func ETDirClose($DirId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirClose', _
		'DWORD',$DirId _
	)


	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETDirDelete($DirId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirDelete', _
		'DWORD',$DirId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETDirEnumOpen($DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirEnumOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETDirEnumNext($EnumId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirEnumNext', _
		'DWORD',$EnumId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETDirEnumClose($EnumId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETDirEnumClose', _
		'DWORD',$EnumId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETFileOpen($File,$DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFileOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId, _
		'DWORD',$File _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETFileCreate($File,$DirId,$Size,$Private=0)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFileCreate', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId, _
		'DWORD',$File, _
		'DWORD',$Size, _
		'DWORD',$Private _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETFileGetInfo($FileId)
	Local $Out=DllStructCreate('WORD name;WORD private;WORD;WORD size')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFileGetInfo', _
		'DWORD',$FileId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Local $Result[3]=[	DllStructGetData($Out,'name'), _
						DllStructGetData($Out,'private'), _
						DllStructGetData($Out,'size')]
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:$Result
EndFunc

Func ETFileRead($FileId)
	Local $FileInfo=ETFileGetInfo($FileId)
	If @error Then Return SetError(@error,0,False)
	Local $Out=DllStructCreate('BYTE ['&$FileInfo[2]&']')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFileRead', _
		'DWORD',$FileId, _
		'DWORD',0, _
		'DWORD',0xFFFF, _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$FileInfo[2] _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETFileWrite($FileId,$Data,$Pos=0)
	$Data=Binary($Data)
	Local $DataSize=BinaryLen($Data)
	Local $In=DllStructCreate('BYTE['&$DataSize&']')
	DllStructSetData($In,1,$Data)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFileWrite', _
		'DWORD',$FileId, _
		'DWORD',$Pos, _
		'PTR',DllStructGetPtr($In), _
		'DWORD',$DataSize _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETFileClose($FileId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFileClose', _
		'DWORD',$FileId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETFileDelete($FileId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFileDelete', _
		'DWORD',$FileId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETFilesEnumOpen($DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFilesEnumOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId _
	)

	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETFilesEnumNext($EnumId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFilesEnumNext', _
		'DWORD',$EnumId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETFilesEnumClose($EnumId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETFilesEnumClose', _
		'DWORD',$EnumId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func ETTokenLabelGet($BindId)
	Local $Out1=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenLabelGet', _
		'DWORD',$BindId, _
		'PTR',0, _
		'PTR',DllStructGetPtr($Out1) _
	)
	If $CallRes[0] Then Return SetError($CallRes[0],0,False)
	Local $Out2=DllStructCreate('CHAR['&DllStructGetData($Out1,1)&']')
	$CallRes=DllCall($ETSdkDll,'WORD','ETTokenLabelGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out2), _
		'PTR',DllStructGetPtr($Out1) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out2,1)
EndFunc

Func ETTokenIDGet($BindId)
	Local $Out1=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenIDGet', _
		'DWORD',$BindId, _
		'PTR',0, _
		'PTR',DllStructGetPtr($Out1) _
	)
	If $CallRes[0] Then Return SetError($CallRes[0],0,False)
	Local $Out2=DllStructCreate('CHAR['&DllStructGetData($Out1,1)&']')
	$CallRes=DllCall($ETSdkDll,'WORD','ETTokenIDGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out2), _
		'PTR',DllStructGetPtr($Out1) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out2,1)
EndFunc

Func ETTokenMaxPinGet($BindId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenMaxPinGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func ETTokenMinPinGet($BindId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETTokenMinPinGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc



Func ETSelectApplet($BindId, $Applet)

Local $In=DllStructCreate('DWORD')
	DllStructSetData($In,1,$Applet)
	Local $CallRes=DllCall($ETSdkDll,'WORD','ETSelectApplet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Applet) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True

EndFunc

Func JCSelectApplet($BindId, $Applet)

Local $In=DllStructCreate('WORD')
	DllStructSetData($In,1,$Applet)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCSelectApplet', _
		'DWORD',$BindId, _
		'WORD',$Applet _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True

EndFunc



Func JCReadersEnumOpen()
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCReadersEnumOpen', _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCReadersEnumNext($EnumId)
	Local $Reader=DllStructCreate('CHAR name[260]; BYTE etoken;')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCReadersEnumNext', _
		'DWORD',$EnumId, _
		'PTR',DllStructGetPtr($Reader) _
	)
	Local $Result[2]=[	DllStructGetData($reader,'name'), _
						DllStructGetData($reader,'etoken')]
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:$Result
EndFunc

Func JCReadersEnumClose($EnumId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCReadersEnumClose', _
		'DWORD',$EnumId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenBind($ReaderName)
	Local $In=DllStructCreate('CHAR['&(StringLen($ReaderName)+1)&']')
	Local $Out=DllStructCreate('DWORD')
	DllStructSetData($In,1,$ReaderName)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenBind', _
		'PTR',DllStructGetPtr($Out), _
		'PTR',DllStructGetPtr($In) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCTokenRebind($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenRebind', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenUnbind($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenUnbind', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenLogin($BindId,$Pin)
	Local $In=DllStructCreate('CHAR['&(StringLen($Pin)+1)&']')
	DllStructSetData($In,1,$Pin)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenLogin', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($In) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenPinChange($BindId,$Pin)
	Local $In=DllStructCreate('CHAR['&(StringLen($Pin)+1)&']')
	DllStructSetData($In,1,$Pin)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenPinChange', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($In) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenLogout($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenLogout', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCRootDirOpen($BindId,$Dir=0)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCRootDirOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$BindId, _
		'WORD',$Dir _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCDirOpen($Dir,$DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$Dir, _
		'DWORD',$DirId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCDirCreate($Dir,$DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirCreate', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$Dir, _
		'DWORD',$DirId, _
		'DWORD',0 _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCDirGetInfo($DirId)
	Local $Out=DllStructCreate('BYTE[8]')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirGetInfo', _
		'DWORD',$DirId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCDirClose($DirId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirClose', _
		'DWORD',$DirId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCDirDelete($DirId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirDelete', _
		'DWORD',$DirId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCDirEnumOpen($DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirEnumOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCDirEnumNext($EnumId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirEnumNext', _
		'DWORD',$EnumId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCDirEnumClose($EnumId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCDirEnumClose', _
		'DWORD',$EnumId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCFileOpen($File,$DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFileOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId, _
		'DWORD',$File _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCFileCreate($File,$DirId,$Size,$Private=0)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFileCreate', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId, _
		'DWORD',$File, _
		'DWORD',$Size, _
		'DWORD',$Private _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCFileGetInfo($FileId)
	Local $Out=DllStructCreate('WORD name;WORD private;WORD;WORD size')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFileGetInfo', _
		'DWORD',$FileId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Local $Result[3]=[	DllStructGetData($Out,'name'), _
						DllStructGetData($Out,'private'), _
						DllStructGetData($Out,'size')]
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:$Result
EndFunc

Func JCFileRead($FileId)
	Local $FileInfo=JCFileGetInfo($FileId)
	If @error Then Return SetError(@error,0,False)
	Local $Out=DllStructCreate('BYTE ['&$FileInfo[2]&']')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFileRead', _
		'DWORD',$FileId, _
		'DWORD',0, _
		'DWORD',0xFFFF, _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$FileInfo[2] _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCFileWrite($FileId,$Data,$Pos=0)
	$Data=Binary($Data)
	Local $DataSize=BinaryLen($Data)
	Local $In=DllStructCreate('BYTE['&$DataSize&']')
	DllStructSetData($In,1,$Data)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFileWrite', _
		'DWORD',$FileId, _
		'DWORD',$Pos, _
		'PTR',DllStructGetPtr($In), _
		'DWORD',$DataSize _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCFileClose($FileId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFileClose', _
		'DWORD',$FileId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCFileDelete($FileId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFileDelete', _
		'DWORD',$FileId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCFilesEnumOpen($DirId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFilesEnumOpen', _
		'PTR',DllStructGetPtr($Out), _
		'DWORD',$DirId _
	)

	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCFilesEnumNext($EnumId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFilesEnumNext', _
		'DWORD',$EnumId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCFilesEnumClose($EnumId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCFilesEnumClose', _
		'DWORD',$EnumId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenLabelGet($BindId)
	Local $Out1=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenLabelGet', _
		'DWORD',$BindId, _
		'PTR',0, _
		'PTR',DllStructGetPtr($Out1) _
	)
	If $CallRes[0] Then Return SetError($CallRes[0],0,False)
	Local $Out2=DllStructCreate('CHAR['&DllStructGetData($Out1,1)&']')
	$CallRes=DllCall($ETSdkDll,'WORD','JCTokenLabelGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out2), _
		'PTR',DllStructGetPtr($Out1) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out2,1)
EndFunc

Func JCTokenIDGet($BindId)
	Local $Out1=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenIDGet', _
		'DWORD',$BindId, _
		'PTR',0, _
		'PTR',DllStructGetPtr($Out1) _
	)
	If $CallRes[0] Then Return SetError($CallRes[0],0,False)
	Local $Out2=DllStructCreate('CHAR['&DllStructGetData($Out1,1)&']')
	$CallRes=DllCall($ETSdkDll,'WORD','JCTokenIDGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out2), _
		'PTR',DllStructGetPtr($Out1) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out2,1)
EndFunc

Func JCTokenMaxPinGet($BindId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenMaxPinGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCTokenMinPinGet($BindId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenMinPinGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

Func JCTokenUnLock($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenUnLock', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenLock($BindId)
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenLock', _
		'DWORD',$BindId _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:True
EndFunc

Func JCTokenPinAttemptsGet($BindId)
	Local $Out=DllStructCreate('DWORD')
	Local $CallRes=DllCall($ETSdkDll,'WORD','JCTokenPinAttemptsGet', _
		'DWORD',$BindId, _
		'PTR',DllStructGetPtr($Out) _
	)
	Return $CallRes[0] _
		?SetError($CallRes[0],0,False) _
		:DllStructGetData($Out,1)
EndFunc

;Начало приложения
Opt("GUIOnEventMode", 1)
Dim $BindId, $filelog, $Result, $DirIdRoot=False, $Edit, $msg, $Fileinfo, $treeview, $generalitem, $displayitem, $diritem, $Edit, $SrcSubId, $Output, $pinbutton, $hPinWin, $PinEdit, $pinokbutton, $pincancelbutton, $Pin, $Edit1, $Reader, $Applet, $AppletID, $text, $CreateDirWin
Global $Dir1, $Dir2
Dim $hParentWin, $hChildWin, $sItemText, $folderbutton, $filebutton, $deletebutton, $CreateFileWin, $FileEdit, $fileokbutton, $filecancelbutton, $publicbutton, $privatebutton, $sizefile
Dim $hFile, $hMain
Global Enum $idSave= 1000, $Save
Dim $Appname = 'JaCarta Editor'


;Функция получения applet ID брутфорсом
Func Applet()
	  GUICtrlSetData($Output, 'Попытка получить applet ID... '&@CRLF,1)
	  Local $Result, $AppletTemp= 0
	  For $Applet = 0 To 65535  Step 1
		 $Result = 0
		 $Result=JCSelectApplet($BindId,$Applet) ; 0x2001 PROJAVA для E-token, 0x1002 PRO, 0x1001 R2, 0x2202 GOST, 0x2205 DATASTORE, 0x2206 ГОСТ-2, 0x2201, 0x2204 (чёрные JaCarta)

			If $Result = True   Then
			   $AppletTemp=$Applet
			   $AppletID=$Applet
			   ExitLoop
			EndIf
	  Next

	  Local $Id=ETTokenLabelGet($BindId)
	  if $Id= False Then
		 For $Applet=$AppletTemp+1 To 65535  Step 1
			 $Result=0
			 $Result=JCSelectApplet($BindId,$Applet)
			   If $Result = True   Then
				  ExitLoop
			   EndIf
		 Next
	  EndIf
	  JCSelectApplet($BindId,$Applet)
	  GUICtrlSetData($Output, 'Select applet 0x'&hex($Applet,4)&@CRLF,1)
	  $AppletID=$Applet
EndFunc


;Просмотр директорий и файлов в цикле
Func PrintDir($Id,$Prefix)

	  Local $EnumId=ETDirEnumOpen($Id)
	  While 1
			Local $dir=ETDirEnumNext($EnumId)
			If @error Then ExitLoop
			Local $DirId=ETDirOpen($dir,$Id)
			Local   $Dirinfo
			$Dirinfo=ETDirGetInfo($DirId)
			Local $Dirtext='(dir)'&hex($dir,4)
			$diritem = _GUICtrlTreeView_AddChild($treeview,$Prefix, $Dirtext)
			PrintDir($DirId,$diritem)
			ETDirClose($DirId)
	  WEnd
	  ETDirEnumClose($EnumId)

	  $EnumId=ETFilesEnumOpen($Id)
	  While 1
			Local $file=ETFilesEnumNext($EnumId)
			If @error Then ExitLoop
			Local $FileId=ETFileOpen($file,$Id)
			$Fileinfo=ETFileGetInfo($FileId)
			Local $filetext='(file)'&hex($file,5)&' '&'p: '&$Fileinfo[1]&' s: '&$Fileinfo[2]&@CRLF
			_GUICtrlTreeView_AddChild($treeview,$Prefix,$filetext)
	  WEnd
	  ETFilesEnumClose($EnumId)
EndFunc

;операции подключения к токену и получения от него информации
Func List()
		 GUICtrlSetData($Output, '')
		 Local $text
		 Local $EnumId=ETReadersEnumOpen()

		 GUICtrlSetData($Output, 'В системе установлены ридеры:'&@CRLF,1)
		 While 1
			   $Reader=ETReadersEnumNext($EnumId)
			   If @error Then ExitLoop
			   GUICtrlSetData($Output, $Reader[0]&@CRLF,1)
		 WEnd
		 ETReadersEnumClose($EnumId)
		 Local $EnumId=ETReadersEnumOpen()
		 $Reader=ETReadersEnumNext($EnumId)
		 $BindId=ETTokenBind($Reader[0])
		 $Result=JCTokenLock($BindId)
		 GUICtrlSetData($Output, 'Подключен ридер '&$Reader[0]&@CRLF,1)

		 ;если не получается получить ID токена, значит надо подбирать AppletID
		 $Result=ETTokenIDGet($BindId)
		 if $Result= False Then
			if $AppletID<>0 Then
			   JCSelectApplet($BindId,$AppletID)
			Else
			   Applet()
			EndIf
		 EndIf

		 $Result=ETTokenIDGet($BindId)
		 $text=$Reader[0]&' ID '&$Result
		 $generalitem = _GUICtrlTreeView_AddChild($treeview,0,$text)
		 $Result=ETTokenLabelGet($BindId)
		 GUICtrlSetData($Output, 'Label: '&$Result&@CRLF,1)
		 $DirIdRoot=ETRootDirOpen($BindId,0) ;0xF007 для банков 0x0001 для крипто про
		 $Result=JCTokenPinAttemptsGet($BindId)

		 ;если был введён пин код начинаем авторизацию
		 If $Pin <> 0   Then
			$Result=JCTokenLogin($BindId,$Pin)
			If $Result=False   Then
			   $Result=JCTokenPinAttemptsGet($BindId)
			   MsgBox(0x10,$Appname,'Неверный PIN код'&@CRLF&'Количество попыток ввода PIN кода: '&$Result )
			Else
			GUICtrlSetData($Output, 'Login OK'&@CRLF,1)
			EndIf
		 EndIf
		 $Result=JCTokenPinAttemptsGet($BindId)
		 GUICtrlSetData($Output, 'Количество попыток ввода PIN кода: '&$Result&@CRLF,1)
		 PrintDir($DirIdRoot,0)
		 ETTokenUnbind($BindId)
		 ETReadersEnumClose($EnumId)

EndFunc

;закрытие дочерних окон и программы
Func onClose()
	  GUISetState(@SW_HIDE, $hPinWin)
	  GUISetState(@SW_HIDE, $hChildWin)
	  GUISetState(@SW_HIDE, $CreateFileWin)
	  if @GUI_WinHandle=$hParentWin Then
		 Exit
	  EndIf
EndFunc

;вывод окна ввода пин кода
Func onPin()
	  GUISetState(@SW_SHOW, $hPinWin )
EndFunc

;подготовка к авторизации после ввода пин кода
Func onPinOK()
	  $Pin=GUICtrlRead($PinEdit)
	  GUISetState(@SW_HIDE, $hPinWin)
	  _GUICtrlTreeView_DeleteAll ($treeview)
	  List()
EndFunc

;отмена ввода пин кода
Func onPinCancel()
	  GUISetState(@SW_HIDE, $hPinWin)
EndFunc

;функция удаления
Func Delete()
	  If $Pin=0   Then
		 MsgBox(0x10,$Appname,'Для удаления файла сначала введите пин код' )
	  Else
		 Local $hItem = _GUICtrlTreeView_GetSelection($treeview)
		 Local $Del = _GUICtrlTreeView_GetText($treeview, $hItem)
		 if _GUICtrlTreeView_GetChildren($treeview, $hItem)=False Then
			$Del=StringTrimLeft (  $Del, 6 )
			Local $p=0
			$p=StringInStr ($Del,"p:")
			$Del=StringMid ( $Del, 1, $p-2 )
			if MsgBox(4 + 32, $Appname,  'Удалить '& $Del &' ?') = 6 Then
			   Local $DirID=_GUICtrlTreeView_GetParentHandle($treeview, $hItem)
			   Local $Dir= _GUICtrlTreeView_GetText($treeview, $DirID)
			   $Dir=StringTrimLeft (  $Dir, 5 )
			   $BindId=ETTokenBind($Reader[0])
			   $Result=JCTokenLock($BindId)

			   if $AppletID<>0 Then
				  JCSelectApplet($BindId,$AppletID)
			   EndIf

			   If $Pin <> 0   Then
				  $Result=JCTokenLogin($BindId,$Pin)
				  If $Result=False   Then
					 $Result=JCTokenPinAttemptsGet($BindId)
					 MsgBox(0x10,$Appname,'Неверный PIN код'&@CRLF&'Количество попыток ввода PIN кода: '&$Result)
				  EndIf
			   EndIf

			   Local $HDir=GetDir(ETRootDirOpen($BindId,0), $Dir)
			   Local $DELFile =JCFileOpen(Dec ($Del), $HDir)
			   JCFileDelete($DELFile )
			   ETDirClose($HDir)
			   ETTokenUnbind($BindId)

			   _GUICtrlTreeView_DeleteAll ($treeview)
               List()
			EndIf

		 Else
			   MsgBox(0x10,$Appname,'Сначала удалите все файлы в папке после чего папка будет удалена автоматически' )
		 EndIf
	  EndIf
EndFunc

;функция вывода окна создания файла
Func onFileCreate()
	  If $Pin=0   Then
		 MsgBox(0x10,$Appname,'Для создания файла сначала введите пин код' )
	  Else
		 Local $hItem = _GUICtrlTreeView_GetSelection($treeview)
		 Local $FileText = 0, $Dir1=0, $Dir2=0
		 $FileText = _GUICtrlTreeView_GetText($treeview, $hItem)

		 ;Проверка не выбрана ли корневая директория
		 if  StringLen($FileText) >20 Then
			   GUICtrlSetData($FileEdit, '')
			   GUICtrlSetData($FileEdit, '//',0)
		 Else
			   $Dir1=StringTrimLeft (  $FileText, 5 )

			   Local $ParentID=_GUICtrlTreeView_GetParentHandle($treeview, $hItem)
			   Local $ParentDir= _GUICtrlTreeView_GetText($treeview, $ParentID)
			   if StringInStr ($ParentDir,"Dir")=0 Then
				  $ParentDir=''
				  GUICtrlSetData($FileEdit, '')
				  GUICtrlSetData($FileEdit, '//'&$Dir1&'/',0)
			   Else
				  $Dir2=StringTrimLeft (  $ParentDir, 5 )
				  $Dir2='/'&$Dir2
				  GUICtrlSetData($FileEdit, '')
				  GUICtrlSetData($FileEdit, '/'&$Dir2&'/'&$Dir1&'/',0)
			   EndIf

		 EndIf
		 GUISetState(@SW_SHOW, $CreateFileWin)
	  EndIf
EndFunc


;отмена создания файла
Func onFileCancel()
	  GUISetState(@SW_HIDE, $CreateFileWin)
EndFunc

;функция создания файла
Func onFileOK()
	  Local $filename=GUICtrlRead($FileEdit)
	  Local $isPrivate=_GUICtrlButton_GetCheck($privatebutton)
	  Local $fileSize=GUICtrlRead($sizefile)
	  $BindId=ETTokenBind($Reader[0])
	  $Result=JCTokenLock($BindId)

	  if $AppletID<>0 Then
		 JCSelectApplet($BindId,$AppletID)
	  EndIf

	  If $Pin <> 0   Then
		 $Result=JCTokenLogin($BindId,$Pin)
		 If $Result=False   Then
			$Result=JCTokenPinAttemptsGet($BindId)
			MsgBox(0x10,$Appname,'Неверный PIN код'&@CRLF&'Количество попыток ввода PIN кода: '&$Result )
		 EndIf
	  EndIf

	  Local $rootdir=ETRootDirOpen($BindId,0)
	  Local $text=StringTrimLeft (  $filename, 2 )
	  Local $text1=StringLeft($text, 4)
	  $dir1=JCDirOpen(Dec ($text1), $rootdir)
	  if $dir1=false Then
		 $dir1= ETDirCreate(Dec ($text1), $rootdir)
	  EndIf

	  if StringLen($text) >12 Then
		 $text=StringTrimLeft (  $text, 5 )
		 $text1=StringLeft($text, 4)
		 $dir2=JCDirOpen(Dec ($text1), $dir1)
		 if $dir2=false Then
			$dir2= ETDirCreate(Dec ($text1), $dir1)
		 EndIf

		 $text=StringTrimLeft (  $text, 5 )
		 Local $DstFile=JCFileCreate(Dec ($text),$Dir2,$fileSize,$isPrivate)
		 JCFileClose($DstFile)
	  Else
		 $text=StringTrimLeft (  $text, 5 )
		 Local $DstFile=JCFileCreate(Dec ($text),$Dir1,$fileSize,$isPrivate)
		 JCFileClose($DstFile)
	  EndIf
	  ETTokenUnbind($BindId)
	  GUISetState(@SW_HIDE, $CreateFileWin)
	  GUISetState(@SW_SHOW, $hParentWin)
	  _GUICtrlTreeView_DeleteAll ($treeview)
	  List()
EndFunc

;сохранение изменённого файла на токене
Func SaveFile()
	  If $Pin=0   Then
		 MsgBox(0x10,$Appname,'Для сохранения файла сначала введите пин код' )
	  Else
		 Local $filebody=GUICtrlRead($Edit1)
		 Local $hItem = _GUICtrlTreeView_GetSelection($treeview)
		 Local $FileEd = _GUICtrlTreeView_GetText($treeview, $hItem)
		 $FileEd=StringTrimLeft (  $FileEd, 6 )
		 Local $p=0
		 $p=StringInStr ($FileEd,"p:")
		 $FileEd=StringMid ( $FileEd, 1, $p-2 )
		 Local $DirID=_GUICtrlTreeView_GetParentHandle($treeview, $hItem)
		 Local $Dir= _GUICtrlTreeView_GetText($treeview, $DirID)
		 $Dir=StringTrimLeft (  $Dir, 5 )
		 $BindId=ETTokenBind($Reader[0])
		 $Result=JCTokenLock($BindId)
		 if $AppletID<>0 Then
			JCSelectApplet($BindId,$AppletID)
		 EndIf

		 If $Pin <> 0   Then
			$Result=JCTokenLogin($BindId,$Pin)
			If $Result=False   Then
			   $Result=JCTokenPinAttemptsGet($BindId)
			   MsgBox(0x10,$Appname,'Неверный PIN код'&@CRLF&'Количество попыток ввода PIN кода: '&$Result)
			EndIf
		 EndIf

		 Local $HDir=GetDir(ETRootDirOpen($BindId,0), $Dir)
		 Local $File=JCFileOpen(Dec ($FileEd),$HDir)
		 Local $Data =Binary('0x' & $filebody)
		 JCFileWrite($File, $Data)
		 JCFileClose($File)
		 ETDirClose($HDir)

		 ETTokenUnbind($BindId)
		 GUISetState(@SW_HIDE, $hChildWin)
		 _GUICtrlTreeView_DeleteAll ($treeview)
         List()

	  EndIf
EndFunc

;сохранение открытого на токене файла на компьютер
Func SaveFileAs()
	  Local  $varFile = 0
	  $varFile = FileSaveDialog( "Сохранить файл", @MyDocumentsDir & "\", "Бинарные файлы (*.bin)", 16,'',$hParentWin)

	  If StringLen($varFile) > 3 Then
		 Local  $filedest
		 $filedest = FileOpen($varFile, 17)
		 ; Check if file open
		 If $filedest = -1 Then
			MsgBox(0, "Error", "Unable to open file.")
			Exit
		 EndIf

		 FileWrite($filedest, $text)
		 FileClose($filedest)
	  EndIf

EndFunc

;Обработка команд меню окна просмотра и редактирования файла
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam

    Switch $wParam
	  Case $Save
            SaveFile()
	  Case $idSave
            SaveFileAs()
    EndSwitch
EndFunc   ;==>WM_COMMAND


;инициализация графического интерфейса
Func GUIInit()
	  $hParentWin=	GUICreate($Appname, 560, 400)
	  GUISetOnEvent($GUI_EVENT_CLOSE,'onClose')

	  ;Создание главного окна
	  $treeview = GUICtrlCreateTreeView(6, 6, 400, 300, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
					 $Output = GUICtrlCreateEdit("" , 6, 320, 400, 70, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
					 $pinbutton = GUICtrlCreateButton("&Ввести PIN код", 430, 20, 100, 50)
					 $filebutton = GUICtrlCreateButton("&Создать", 430, 80, 100, 50)
					 $deletebutton = GUICtrlCreateButton("&Удалить", 430, 140, 100, 50)

	  ;Создание окна ввода пин кода
	  $hPinWin = GUICreate('Введите PIN код', 200, 200, -1, -1, $WS_SYSMENU, -1, $hParentWin)
                    $PinEdit = GUICtrlCreateInput ("" , 50, 40, 100, 25, $ES_PASSWORD + $ES_NOHIDESEL + $ES_WANTRETURN)
                    $pinokbutton = GUICtrlCreateButton("&OK", 20, 100, 60, 40)
                    $pincancelbutton = GUICtrlCreateButton("&Отмена", 110, 100, 60, 40)

	  ;Окно создания файла
	  $CreateFileWin = GUICreate('Создание папок и файла', 340, 350, -1, -1, $WS_SYSMENU, -1, $hParentWin)
                    $FileEdit = GUICtrlCreateInput ("" , 50, 70, 230, 25)
                    $fileokbutton= GUICtrlCreateButton("&OK", 70, 240, 60, 40)
                    $filecancelbutton = GUICtrlCreateButton("&Отмена", 210, 240, 60, 40)
                    $publicbutton= _GUICtrlButton_Create($CreateFileWin, "Public", 100, 120, 50, 30,  $BS_AUTORADIOBUTTON, 0)
                    $privatebutton=_GUICtrlButton_Create($CreateFileWin, "Private", 160, 120, 50, 30,  $BS_AUTORADIOBUTTON, 0)
                    _GUICtrlButton_SetCheck($publicbutton,  $BST_CHECKED)
                    Local $label=GUICtrlCreateLabel('Введите имя папок и файла в hex формате 1001 ', 70, 20, 170, 40, $SS_CENTER)
                    $sizefile = GUICtrlCreateInput ("10" , 220, 175, 50, 20)
                    Local $label1=GUICtrlCreateLabel('Введите размер файла в байтах', 20, 180, 200, 60, $SS_CENTER)

	  ;Окно редактирования файла
	  $hChildWin = GUICreate($sItemText, 300, 230, -1, -1, $WS_SYSMENU, -1, $hParentWin)
				    $Edit1 = GUICtrlCreateEdit("", 10, 10, 240, 160, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)

	  ; Создаёт меню "Файл" в окне редактирования файла
	  $hFile = _GUICtrlMenu_CreateMenu ()
	  _GUICtrlMenu_InsertMenuItem ($hFile, 0, 'Сохранить как...', $idSave)
	  _GUICtrlMenu_InsertMenuItem ($hFile, 1, 'Сохранить изменения', $Save)
	  $hMain = _GUICtrlMenu_CreateMenu ()
	  _GUICtrlMenu_InsertMenuItem ($hMain, 0, 'Файл', 0, $hFile)
	  _GUICtrlMenu_SetMenu ($hChildWin, $hMain)

	  ;Определение событий
	  GUICtrlSetOnEvent($filebutton,'onFileCreate')
	  GUICtrlSetOnEvent($deletebutton,'Delete')
	  GUICtrlSetOnEvent($pinbutton,'onPin')
	  GUICtrlSetOnEvent($pinokbutton,'onPinOK')
	  GUICtrlSetOnEvent($pincancelbutton,'onPinCancel')
	  GUICtrlSetOnEvent($fileokbutton,'onFileOK')
	  GUICtrlSetOnEvent($filecancelbutton,'onFileCancel')
	  GUISetOnEvent($GUI_EVENT_CLOSE,'onClose')

	  GUISetState(@SW_SHOW, $hParentWin)
	  GUIRegisterMsg(0x0111, "WM_COMMAND")
EndFunc

;запуск основных функций приложения
GUIInit()
List()

;функция обработки двойного щелчка мышью на дереве файлов и директорий
GUIRegisterMsg($WM_NOTIFY, "MY_WM_NOTIFY")
Global $iDoubleClick = 0

Func MY_WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)

    Local $tagNMHDR, $vEvent

    Switch $wParam
        Case $treeview
            $tagNMHDR = DllStructCreate("int;int;int", $lParam)
            If @error Then Return
            $vEvent = DllStructGetData($tagNMHDR, 3)
            If $vEvent = $NM_DBLCLK Then
                $iDoubleClick = 1
            EndIf
    EndSwitch
    $tagNMHDR = 0

EndFunc  ;==>MY_WM_NOTIFY

;функция поиска директории, в которой кликнули по файлу
Func GetDir( $Id,$Dir_Id)
	  Local $DirId=0
	  Local $DirResult=0
	  Local $EnumId=ETDirEnumOpen($Id)

	  While 1
		Local $dir=ETDirEnumNext($EnumId)
		If @error Then ExitLoop
			$DirId=ETDirOpen($dir,$Id)
			if hex($dir,4)=$Dir_Id Then
			   $DirResult=$DirId
			   ExitLoop
			EndIf
			$DirResult=GetDir( $DirId, $Dir_Id)
			ETDirClose($DirId)
	  WEnd
	  ETDirEnumClose($EnumId)
	  Return  $DirResult
EndFunc

;функция открытия файла на токене и вывода его содержимого в дочернее окно
Func ListFile($file, $Dir_Id)
	  $BindId=ETTokenBind($Reader[0])
	  $Result=JCTokenLock($BindId)

	  if $AppletID<>0 Then
		 JCSelectApplet($BindId,$AppletID)
	  EndIf
	  If $Pin <> 0   Then
		 $Result=JCTokenLogin($BindId,$Pin)
		 If $Result=False   Then
			$Result=JCTokenPinAttemptsGet($BindId)
			MsgBox(0x10,$Appname,'Неверный PIN код'&@CRLF&'Количество попыток ввода PIN кода: '&$Result )
		 EndIf
	  EndIf

	  if StringLen($Dir_Id)>10 Then
		 $HDir=ETRootDirOpen($BindId,0)
	  Else
		 Local $HDir=GetDir(ETRootDirOpen($BindId,0), $Dir_Id)
	  EndIf

	  $SrcSubId=JCFileOpen(Dec ($file), $HDir)
	  $text=JCFileRead($SrcSubId)
	  GUICtrlSetData($Edit1, hex($text))
	  JCFileClose($SrcSubId)
	  ETDirClose($HDir)
	  ETTokenUnbind($BindId)
EndFunc

;обработка двойного щелчка мышью и получения имени файла на токене
   While 1

      if $iDoubleClick Then
		 Local $hItem = _GUICtrlTreeView_GetSelection($treeview)
		 if _GUICtrlTreeView_GetChildren($treeview, $hItem)=False Then
			Local $hItem = _GUICtrlTreeView_GetSelection($treeview)
			$sItemText = _GUICtrlTreeView_GetText($treeview, $hItem)
			if StringInStr ($sItemText,"Dir")=0 Then
			   Local $text1=0
			   $text1=StringTrimLeft (  $sItemText, 6 )
			   Local $p=0
			   $p=StringInStr ($text1,"p:")
			   $sItemText=0
			   $sItemText=StringMid ( $text1, 1, $p-2 )
			   GUISetState(@SW_SHOW, $hChildWin)
			   GUISetOnEvent($GUI_EVENT_CLOSE,'onClose')
			   Local $DirID=_GUICtrlTreeView_GetParentHandle($treeview, $hItem)
			   Local $Dir= _GUICtrlTreeView_GetText($treeview, $DirID)
			   $text1=StringTrimLeft (  $Dir, 5 )
			   $Dir=$text1
			   ListFile($sItemText, $Dir)
			EndIf
		 EndIf
		 $iDoubleClick = 0
     EndIf

   WEnd



Инициализировать | СБИС Помощь

Инициализировать JaCarta

Во время инициализации освобождается память устройства: удаляется хранящаяся на JaCarta информация, сбрасывается значение пароля.

Рекомендуем проводить инициализацию нового носителя перед генерацией ЭП на JaCarta SE (PKI/ГОСТ), JaCarta-2 SE или JaCarta LT, чтобы проверить его исправность и установить стандартные пин-коды. Инициализировать можно носители:

Внимание!

Инициализировать раздел ГОСТ на JaCarta с электронной подписью, полученной в удостоверяющем центре «Тензор», не нужно. Это приведет к уничтожению ЭП.

JaCarta SE

JaCarta-2 SE

Выполняется, когда нужно очистить один из разделов носителя.

  1. Запустите «Единый клиент JaCarta» и переключитесь в режим администрирования.
  2. Инициализируйте раздел:
    • PKI. Для этого нажмите «Инициализировать приложение». Укажите имя токена (по умолчанию STANDART.SE), введите пин-код администратора и новый пин-код пользователя (рекомендуем оставить тот, который был установлен по умолчанию).
    • Первый раздел ГОСТ (с поддержкой ключей по ГОСТ Р 34.10-2001). Укажите имя токена (по умолчанию STANDART.SE), введите пин-код администратора и новый пин-код пользователя (рекомендуем оставить тот, который был установлен по умолчанию). Нажмите «Инициализировать приложение».
    • Второй раздел ГОСТ (с поддержкой ключей по ГОСТ Р 34.10-2012). Нажмите «Инициализировать пользователем», укажите имя токена (по умолчанию STANDART.SE) и пин-код пользователя.

JaCarta LT

Выполняется, когда нужно полностью очистить носитель.

  1. Запустите «Единый клиент JaCarta» и переключитесь в режим администрирования.
  2. На вкладке «STORAGE» нажмите «Инициализировать приложение».
  3. Укажите пин-код администратора и новый пин-код пользователя (рекомендуем оставить тот, который был установлен по умолчанию). Нажмите «Выполнить».
  4. В окне предупреждения нажмите «Продолжить».

Статьи по теме

Извлечение ключа из токена с неизвлекаемым ключом / Habr

Довольно часто при оформлении сертификатов ключей электронной подписи можно наблюдать навязчивый пиар токенов с неизвлекаемым ключом. Продавцы из удостоверяющих центров уверяют, что, купив у них СКЗИ КриптоПРО CSP и токен с неизвлекаемым ключом (Рутокен ЭЦП или JaCarta ГОСТ), мы получим сертифицированные СКЗИ, обеспечивающие 100%-ную защиту от кражи ключей с токена. Но так ли это на самом деле? Для ответа на этот вопрос проведем простой эксперимент…

Конфигурация тестового стенда


Соберем тестовый стенд с конфигурацией, типовой для машин, участвующих в электронном документообороте (ЭДО):
  1. ОС MS Windows 7 SP1
  2. СКЗИ КриптоПРО CSP 3.9.8423
  3. Драйверы Рутокен для Windows (x86 и x64). Версия: v.4.1.0.0 от 20.06.2016, WHQL-certified
  4. Единый Клиент JaCarta и JaCarta SecurLogon. Версия 2.9.0 сборка 1531
  5. КриптоАРМ Стандарт Плюс 5. Версия 5.2.0.8847.

Для тестирования будут использоваться токены с неизвлекамым ключом:
  1. Рутокен ЭЦП. Версия 19.02.14.00 (02)
  2. JaCarta ГОСТ. Номер модели JC001-2.F09 v2.1

Методика тестирования


Смоделируем типовой процесс подготовки Администратором информационной безопасности ключевых документов для организации ЭДО:
  1. генерируется контейнер закрытого ключа и запрос на сертификат открытого ключа;
  2. после прохождения в удостоверяющем центре процедуры сертификации из запроса получается сертификат;
  3. сертификат в совокупности с контейнером закрытого ключа образует готовую для использования ключевую информацию. Данную ключевую информацию, записанную на носителе, будем называть исходным ключевым документом;
  4. с исходного ключевого документа изготавливаются копии, которые записываются на отчуждаемые носители (далее будем называть их рабочими ключевыми документами) и передаются уполномоченным пользователям;
  5. после изготовления необходимого количества рабочих ключевых документов исходный ключевой документ уничтожается или депонируется на хранение в орган криптографической защиты информации.

В нашем случае мы не будем пользоваться услугами центров сертификации, а сгенерируем ключевой контейнер с самоподписанным сертификатом и разместим его в реестре компьютера (АРМа генерации ключевой информации), это и будет исходный ключевой документ. Затем скопируем ключевую информацию на Рутокен ЭЦП и JaCarta ГОСТ, изготовив рабочие ключевые документы. После этого уничтожим исходный ключевой документ, удалив из реестра ключевой контейнер. И, наконец, попробуем скопировать ключевую информацию с рабочих ключевых документов обратно в реестр.

Проведение тестирования


1. Создадим исходный ключевой документ.
2.Сформируем рабочие ключевые документы.

3.Уничтожим исходный ключевой документ
Описание

Штатными средствами СКЗИ КриптоПРО CSP удалим из реестра ключевой контейнер test-key-reestr.


4. Скопируем ключевую информацию из рабочих ключевых документов

Как мы видим, ключевая информация успешно скопирована или, другим языком, извлечена из токенов с неизвлекаемым ключом. Получается, что производители токенов и СКЗИ врут? На самом деле нет, и ситуация сложнее, чем кажется на первый взгляд. Исследуем матчасть по токенам.

Матчасть


То, что на рынке принято называть токеном с неизвлекаемым ключом, правильно называется функциональным ключевым носителем (ФКН) (доп. инфо).

Главным отличием ФКН от обычных токенов (Рутокен S, JaCarta PKI, …) в том, что при выполнении криптографических преобразований (например, формирование электронной подписи) закрытый ключ не покидает устройство. В то время как при использовании обычных токенов закрытый ключ копируется с токена в память комптьютера.

Использование ФКН требует особой организации взаимодействия между прикладным криптографическим ПО и библиотекой СКЗИ (криптопровайдером или, по-другому, CSP).

Здесь важно увидеть, что программная часть библиотеки СКЗИ должна знать о существовании на токене апплета, реализующего криптографический функционал (например, генерация ключа, подпись данных и т.д.) и уметь с ним работать.

По-новому взглянем на наш тестовый стенд


В качестве одного из ключевых носителей использовался Рутокен ЭЦП. Через «Панель управления Рутокен» о нем можно получить следующую информацию:

В последней строке указана фраза «Поддержка КриптоПРО ФКН: Нет», а это значит, что на токене нет апплета, с которым умеет работать СКЗИ КриптоПРО CSP. Таким образом, реализация технологии ФКН с использованием СКЗИ и токенов, описанных в конфигурации тестового стенда, невозможна.

Аналогичная ситуация и с JaCarta ГОСТ. Более того, СКЗИ КриптоПРО CSP, по крайней мере та версия, которая использовалась в тестовом стенде, использует данные ключевые носители как «обычные токены», которые, в свою очередь, являются просто носителями ключа.

Это утверждение очень просто подтвердить. Для этого надо поставить СКЗИ КриптоПРО CSP на чистую машину без драйверов от токенов и подключить токен JaCarta ГОСТ. ОС Windows 7 обнаружит токен JaCarta ГОСТ как «Устройство чтения смарт-карт Microsoft Usbccid (WUDF)». теперь можно попробовать создать ключ на токене и скопировать его в реестр компьютера. Весь функционал СКЗИ успешно отработает.

Как сделать, чтобы все было хорошо?


Чтобы с помощью продуктов ООО “КРИПТО-ПРО” реализовать технологию ФКН, необходимо:

1. Купить специальную версию библиотеки СКЗИ:
— для Рутокен ЭЦП — СКЗИ КриптоПРО Рутокен CSP.
— для JaCarta ГОСТ – СКЗИ КриптоПро ФКН CSP.

2. Одновременно с библиотекой СКЗИ необходимо приобрести специально подготовленные токены, содержащие в себе программные части (апплеты), с которыми умеет работать КриптоПРО Рутокен CSP или КриптоПро ФКН CSP соответственно.

Получается, что Рутокен ЭЦП и JaCarta ГОСТ не являются токенами с неизвлекаемым ключом?


Опять нет. Данные устройства могут реализовывать функционал ФКН (но, возможно, в меньшем объеме, чем при использовании их совместно с СКЗИ КриптоПРО), но для этого нужен софт, который умеет работать с апплетами размещенными на токенах. Таким софтом может быть КриптоАРМ Стандарт 5 Плюс. Он это умеет. При генерации ключевой пары в мастере КриптоАРМ можно выбрать криптопровайдер, который будет использоваться, например, Rutoken ECP или eToken GOST. Это и позволит использовать токен как ФКН.

Выводы

  • Не верьте продавцам, чушь вам городящим. Использование обычных версий криптопровайдера КриптоПРО CSP и обычных Рутокен ЭЦП или JaCarta ГОСт не позволяют реализовать технологию ФКН.
  • Для использования технологии ФКН совместно с продуктами ООО «КРИПТО-ПРО» необходимы как специально подготовленные токены, содержащие апплет, с которым умеет работать СКЗИ, так и специальные версии криптопровайдера КриптоПРО CSP, которые умеют работать с апплетом на токенах.
  • Рутокен ЭЦП и JaCarta ГОСТ умеет самостоятельно реализовывать технологию ФКН, но для этого необходим специальный софт.

Криптопро не видит ключ JaCarta, решаем за минуту

Добрый день! Уважаемые читатели и подписчики IT блога Pyatilistnik.org. Последние два дня у меня была интересная задача по поиску решения на вот такую ситуацию, есть физический или виртуальный сервер, на нем установлена наверняка многим известная КриптоПРО. На сервер подключен USB ключ JaCarta, который используется для подписи документов для ВТБ24 ДБО. Локально на Windows 10 все работает, а вот на серверной платформе Windows Server 2016 и 2012 R2, Криптопро не видит ключ JaCarta. Давайте разбираться в чем проблема и как ее поправить.

Описание окружения

Есть виртуальная машина на Vmware ESXi 6.5, в качестве операционной системы установлена Windows Server 2012 R2. На сервере стоит КриптоПРО 4.0.9944, последней версии на текущий момент. С сетевого USB хаба, по технологии USB over ip, подключен ключ JaCarta. Ключ в системе видится, а вот в КриптоПРО нет.

Алгоритм решения проблем с JaCarta

КриптоПРО очень часто вызывает различные ошибки в Windows, простой пример (Windows installer service could not be accessed). Вот так вот выглядит ситуация, когда утилита КриптоПРО не видит сертификат в контейнере.

Как видно в утилите UTN Manager ключ подключен, он видится в системе в смарт картах в виде Microsoft Usbccid (WUDF) устройства, но вот CryptoPRO, этот контейнер не определяет и у вас нет возможности установить сертификат. Локально токен подключали, все было то же самое. Стали думать что сделать.

Возможные причины с определением контейнера

  1. Во первых, это проблема с драйверами, например, в Windows Server 2012 R2, JaCarta в идеале должна определяться в списке смарт карт как JaCarta Usbccid Smartcard, а не Microsoft Usbccid (WUDF)
  2. Во вторых если устройство видится как Microsoft Usbccid (WUDF), то версия драйверов может быть устаревшей, и из-за чего ваши утилиты будут не определять защищенный USB носитель.
  3. Устарелая версия CryptoPRO

Как решить проблему, что криптопро не видит USB ключ?

Создали новую виртуальную машину и стали ставить софт все последовательно.

Перед установкой любого программного обеспечения работающего с USB носителями на которых находятся сертификаты и закрытые ключи. Нужно ОБЯЗАТЕЛЬНО отключить токен, если воткнут локально, то отключаем его, если по сети, разрываем сессию

Установка единого клиента JaCarta PKI

Единый Клиент JaCarta — это специальная утилита от компании «Аладдин», для правильной работы с токенами JaCarta. Загрузить последнюю версию, данного программного продукта, вы можете с официального сайта, или у меня с облака, если вдруг, не получиться с сайта производителя.

Далее полученный архив вы распаковываете и запускаете установочный файл, под свою архитектуру Windows, у меня это 64-х битная. Приступаем к установке Jacarta драйвера. Единый клиент Jacarta, ставится очень просто (НАПОМИНАЮ ваш токен в момент инсталляции, должен быть отключен). На первом окне мастера установки, просто нажимаем далее.

Принимаем лицензионное соглашение и нажимаем «Далее»

Чтобы драйвера токенов JaCarta у вас работали корректно, достаточно выполнить стандартную установку.

Если выберете «Выборочную установку», то обязательно установите галки:

  • Драйверы JaCarta
  • Модули поддержки
  • Модуль поддержки для КриптоПРО

Далее нажимаем «Установить».

Через пару секунд, Единый клиент Jacarta, успешно установлен.

Обязательно произведите перезагрузку сервера или компьютера, чтобы система увидела свежие драйвера.

Установка КриптоПРО

После установки JaCarta PKI, нужно установить КриптоПРО, для этого заходите на официальный сайт.

https://www.cryptopro.ru/downloads

На текущий момент самая последняя версия КриптоПро CSP 4.0.9944. Запускаем установщик, оставляем галку «Установить корневые сертификаты» и нажимаем «Установить (Рекомендуется)»

Инсталляция КриптоПРО будет выполнена в фоновом режиме, после которой вы увидите предложение, о перезагрузке браузера, но я вам советую полностью перезагрузиться.

После перезагрузки подключайте ваш USB токен JaCarta. У меня подключение идет по сети, с устройства DIGI, через клиента Anywhere View. В клиенте Anywhere View, мой USB носитель Jacarta, успешно определен, но как Microsoft Usbccid (WUDF), а в идеале должен определиться как JaCarta Usbccid Smartcard, но нужно в любом случае проверить, так как все может работать и так.

Открыв утилиту «Единый клиент Jacarta PKI», подключенного токена обнаружено не было, значит, что-то с драйверами.

Microsoft Usbccid (WUDF) — это стандартный драйвер Microsoft, который по умолчанию устанавливается на различные токены, и бывает, что все работает, но не всегда. Операционная система Windows по умолчанию, ставит их в виду своей архитектуры и настройки, мне вот лично в данный момент такое не нужно. Что делаем, нам нужно удалить драйвера Microsoft Usbccid (WUDF) и установить драйвера для носителя Jacarta.

Откройте диспетчер устройств Windows, найдите пункт «Считыватели устройств смарт-карт (Smart card readers)» щелкните по Microsoft Usbccid (WUDF) и выберите пункт «Свойства». Перейдите на вкладку «Драйвера» и нажмите удалить (Uninstall)

Согласитесь с удалением драйвера Microsoft Usbccid (WUDF).

Вас уведомят, что для вступления изменений в силу, необходима перезагрузка системы, обязательно соглашаемся.

После перезагрузки системы, вы можете увидеть установку устройства и драйверов ARDS Jacarta.

Откройте диспетчер устройств, вы должны увидеть, что теперь ваше устройство определено, как JaCarta Usbccid Smartcar и если зайти в его свойства, то вы увидите, что смарт карта jacarta, теперь использует драйвер версии 6.1.7601 от ALADDIN R.D.ZAO, так и должно быть.

В диспетчере устройств вы можете увидеть вот такие ошибки:

Если открыть единый клиент Jacarta, то вы увидите свою электронную подпись, это означает, что смарт карта нормально определилась.

Открываем CryptoPRO, и видим, что криптопро не видит сертификат в контейнере, хотя все драйвера определились как нужно. Есть еще одна фишка.

  1. В RDP сессии вы не увидите свой токен, только локально, уж такая работа токена, либо я не нашел как это поправить. Вы можете попробовать выполнить рекомендации по устранению ошибки «Не возможно подключиться к службе управления смарт-картами».
  2. Нужно снять одну галку в CryptoPRO

ОБЯЗАТЕЛЬНО снимите галку «Не использовать устаревшие cipher suite-ы» и перезагрузитесь.

После этих манипуляций у меня КриптоПРО увидел сертификат и смарт карта jacarta стала рабочей, можно подписывать документы.

Еще можете в устройствах и принтерах, увидеть ваше устройство JaCarta,

Если у вас как и у меня, токен jacarta установлен в виртуальной машине, то вам придется устанавливать сертификат, через console виртуальной машины, и так же дать на нее права ответственному человеку. Если это физический сервер, то там придется давать права на порт управления, в котором так же есть виртуальная консоль.

Не возможно подключиться к службе управления смарт-картами

Когда вы установили все драйвера для токенов Jacarta, вы можете увидеть при подключении по RDP и открытии утилиты «Единый клиент Jacarta PKI» вот такое сообщение с ошибкой:

Не возможно подключиться к службе управления смарт-картами

  1. Не запущена служба смарт-карт на локальной машине. Архитектурой RDP-сессии, разработанной Microsoft, не предусмотрено использование ключевых носителей, подключенных к удалённому компьютеру, поэтому в RDP-сессии удалённый компьютер использует службу смарт-карт локального компьютера. Из этого следует что, запуска службы смарт-карт внутри RDP-сессии недостаточно для нормальной работы.
  2. Служба управления смарт-картами на локальном компьютере запущена, но недоступна для программы внутри RDP-сессии из-за настроек Windows и/или RDP-клиента.\

Как исправить ошибку «Не возможно подключиться к службе управления смарт-картами».

  • Запустите службу смарт-карт на локальной машине, с которой вы инициируете сеанс удалённого доступа. Настройте её автоматический запуск при старте компьютера.
  • Разрешите использование локальных устройств и ресурсов во время удалённого сеанса (в частности, смарт-карт). Для этого, в диалоге «Подключение к удалённому рабочему столу» в параметрах выберите вкладку «Локальные ресурсы», далее в группе «Локальные устройства и ресурсы» нажмите кнопку «Подробнее…», а в открывшемся диалоге выберите пункт «Смарт-карты» и нажмите «ОК», затем «Подключить».

  • Убедитесь в сохранности настроек RDP-подключения. По умолчанию они сохраняются в файле Default.rdp в каталоге «Мои Документы» Проследите, чтобы в данном файле присутствовала строчка «redirectsmartcards:i:1».
  • Убедитесь в том, что на удалённом компьютере, к которому вы осуществляете RDP-подключение, не активирована групповая политика
    [Computer Configuration\Administrative Templates\Windows Components\Terminal Services\Client\Server data redirection\Do not allow smart card device redirection] -[Конфигурация компьютера\административные шаблоны\компоненты windows\службы удалённых рабочих столов\узел сеансов удалённых рабочих столов\перенаправление устройств и ресурсов\Не разрешать перенаправление устройства чтения смарт-карт]. Если она включена (Enabled), то отключите её, и перегрузите компьютер.
  • Если у вас установлена Windows 7 SP1 или Windows 2008 R2 SP1 и вы используете RDC 8.1 для соединения с компьютерами под управлением Windows 8 и выше, то вам необходимо установить обновление для операционной системы https://support.microsoft.com/en-us/kb/2913751

Вот такой вот был траблшутинг по настройке токена Jacarta, КриптоПРО на терминальном сервере, для подписи документов в ВТБ24 ДБО. Если есть замечания или поправки, то пишите их в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *