Статус: Новичок
Группы: Участники
Зарегистрирован: 21.10.2013(UTC) Сообщений: 9  Откуда: г. Нижневартовск Сказал(а) «Спасибо»: 1 раз
|
Андрей, спасибо! Кэширование не совсем подходит, т.к. в этом случае после первого ввода pin-код вообще не запрашивается, даже после выхода из приложения и повторного входа. Да и сам ключ в этом случае не требуется, все хранится в кэше. Проще поставить галку "Запомнить pin-код", но мне нужно, чтобы pin-код запрашивался один раз при подписании каждого пакета файлов. Пробовал разобраться с примерами на форуме, но знаний и подготовки не хватает. :(
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,513   Сказал «Спасибо»: 554 раз Поблагодарили: 2252 раз в 1757 постах
|
Тогда попробовать не "освобождать" контекст выбранного сертификата (объект) |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.10.2013(UTC) Сообщений: 9  Откуда: г. Нижневартовск Сказал(а) «Спасибо»: 1 раз
|
Андрей, добрый день! Что-то ничего у меня не получается. Вот мой код на VBA.
Option Compare Database Option Explicit
Public Certificate Public Store Public Signer Public SignedData
Const CAPICOM_MY_STORE = "MY" Const CAPICOM_CURRENT_USER_STORE = 2 Const CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6 Const CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9 Const CAPICOM_PROPID_KEY_PROV_INFO = 2 Const CAPICOM_ENCODE_BINARY = 1 Const CAPICOM_ENCODE_BASE64 = 0
'--Основная функция Sub main(FileName) Dim BinaryString Dim Message Dim Stream
LoadFileAsBinaryString FileName, BinaryString Signfile BinaryString, Message If IsEmpty(Message) Then Exit Sub SaveBinFile FileName & ".sig", Message '-- Выбираем серификат Public Sub SignerCertificate()
Dim Certificates Dim StoreName Dim StoreLocation Dim OUR_CERTIFICATE_Name Dim CAPIUtil
OUR_CERTIFICATE_Name = ”Иванов Иван Иванович”
On Error GoTo Err_Handler
'Объявление Объектов Set Store = CreateObject("CAPICOM.Store") Set Signer = CreateObject("CAPICOM.Signer")
'Чтение серитфикатов из хранилища. StoreLocation = CAPICOM_CURRENT_USER_STORE StoreName = CAPICOM_MY_STORE Store.Open StoreLocation, StoreName
Set Certificates = Store.Certificates ' Из них не рассматриваются сертификаты, в которых отсутствует закрытый ключ. If Certificates.Count > 0 Then Set Certificates = Certificates.Find(CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY, CAPICOM_PROPID_KEY_PROV_INFO) End If ' Из них выбираются только сертификаты, действительные в настоящее время. If Certificates.Count > 0 Then Set Certificates = Certificates.Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID, DateSerial(Year(Now), Month(Now), Day(Now))) End If
' По имени владельца определим наш сертификат. For Each Certificate In Certificates If Certificate.GetInfo(CAPICOM_CERT_INFO_SUBJECT_DNS_NAME) = OUR_CERTIFICATE_Name Then Exit For End If Next
If IsEmpty(Certificate) Then Debug.Print "ERROR: Our Certificate not found!" Set Certificates = Nothing Set Store = Nothing Exit Sub End If
'--Заполняем объект Signer Signer.Certificate = Certificate Signer.Options = CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY
Set CAPIUtil = CreateObject("CAPICOM.Utilities")
AddAttribute Signer, CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME, CAPIUtil.LocalTimeToUTCTime(Now)
Set SignedData = CreateObject("CAPICOM.SignedData")
'Освобождакм объекты Set Certificates = Nothing Set Store = Nothing
End Sub
'-- Читаем файл в бинарную строку. Sub LoadFileAsBinaryString(FileName, BinaryString) Dim Stream Dim CAPIUtil Dim B, b2 Const adTypeBinary = 1
Set Stream = CreateObject("ADODB.Stream") Set CAPIUtil = CreateObject("CAPICOM.Utilities") Stream.Open Stream.Type = adTypeBinary Stream.LoadFromFile (FileName) B = Stream.Read BinaryString = CAPIUtil.ByteArrayToBinaryString(B) Stream.Close b2 = CAPIUtil.BinaryStringToByteArray(BinaryString) End Sub
'-- Save binary array to FileName. Sub SaveBinFile(FileName, Message) Dim Stream Dim Binarray() As Byte Const adSaveCreateOverWrite = 2 Const adTypeBinary = 1 Const adModeReadWrite = 3
Binarray = Message 'Debug.Print VarType(Binarray2) Set Stream = CreateObject("ADODB.Stream") Stream.Type = adTypeBinary Stream.Mode = adModeReadWrite Stream.Open Stream.Write Binarray Stream.SaveToFile FileName, adSaveCreateOverWrite Stream.Close Set Stream = Nothing End Sub
'-- Подписываем Sub Signfile(Content, Message)
On Error GoTo Err_Handler
SignedData.Content = Content Message = SignedData.Sign(Signer, True, CAPICOM_ENCODE_BINARY) Exit Sub Err_Handler: MsgBox "Вставьте нужный ключ" Err.Clear Signfile Content, Message End Sub
'-- Установить Аттрибут Signer Sub AddAttribute(Signer, AttrName, AttrVal) Dim Attribut Set Attribut = CreateObject("CAPICOM.Attribute") Attribut.Name = AttrName Attribut.Value = AttrVal Signer.AuthenticatedAttributes.Add Attribut Set Attribut = Nothing End Sub
Посмотрите пожалуйста, что нужно изменить, чтобы pin-код запрашивался один раз при подписи первого файла, или как "подсунуть" pin-код в виде переменной. Запрос pin-кода происходит на этой строке: Код:Message = SignedData.Sign(Signer, True, CAPICOM_ENCODE_BINARY)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,513   Сказал «Спасибо»: 554 раз Поблагодарили: 2252 раз в 1757 постах
|
Автор: xax  Андрей, добрый день! Что-то ничего у меня не получается. Вот мой код на VBA. Посмотрите пожалуйста, что нужно изменить, чтобы pin-код запрашивался один раз при подписи первого файла, или как "подсунуть" pin-код в виде переменной.Запрос pin-кода происходит на этой строке: Код:Message = SignedData.Sign(Signer, True, CAPICOM_ENCODE_BINARY)
Автор: Kirill Sobolev  Воспользуйтесь нашим объектом CAdESCOM из состава ЭЦП SDK.Дистрибутив доступен для загрузки на сайте, документация тут. Такой вариант еще есть: Свойство ICPSigner4::KeyPin |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close