Тема: Lotus и КриптоПро
Пробуем через COM подписывать в лотусскрипте данные с помощью Криптопро.
На форме: Что подписываем: - поле "tosign"
ЭЦП: - поле "signpole"
Пример 1.
Сначала пробуем получить сертификаты в Lotus через виндовый элемент управления CAPICOM.
В этом варианте для юзера есть окошечко выбора сертификата.
В конце уже присвоили элементу CAdESCOM сертификат из элемента CAPICOM.
В данном примере юзер может выбирать сертификат.
Sub Click(Source As Button) ' через CAPICOM
Dim Signer As Variant ' кто подписывает
Dim Store As Variant ' хранилище сертификатов
Dim Certificates As Variant ' все сертификаты
Dim Certif As Variant ' поиск непросроч. сертификатов для выбора одного сертификата
Dim Build As Variant
Dim MySert As Variant ' один выбранный сертификат
Dim MySert1 As Variant ' один выбранный сертификат (Certificate object)
Dim privateKey As Variant
ProviderName$ = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"
'Set Signer = CreateObject("CAPICOM.Signer")
Set Store = CreateObject("CAPICOM.Store")
Build = Store.Open (2,"MY")
Set Certificates = Store.Certificates
'xxx = Certificates.Count
'xxx = Certificates.Select("123", "ВЫБЕРИ СЕРТИФИКАТ!") все сертификаты
Set Certif = Certificates.Find(9, Now)
Set MySert = Certif.Select("123", "ВЫБЕРИ СЕРТИФИКАТ!") ' непросроченные
Set MySert1 = MySert.Item(1)
Print "Сертификат для " + (MySert1.SubjectName)
Set privateKey = MySert1.PrivateKey
Print (privateKey.ProviderName)
'Set xxx = Signer.Load (MySert1)
' -----------------------------------------------------------------------------------------------
Dim oSigner As Variant
Set oSigner = CreateObject("CAdESCOM.CPSigner")
oSigner.TSAAddress = "http://testca.cryptopro.ru/tsp/tsp.srf"
Set oSigner.Certificate = MySert1 ' Присвоили CAdESCOM сертификат из CAPICOM
Dim oSignedData As Variant
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
oSignedData.Content = doc.GetItemValue("tosign")(0) 'ЧТО подписываем
'sSignedData = oSignedData.Sign(oSigner, False)
sSignedData = oSignedData.SignCades(oSigner, 1, False)
Call doc.ReplaceItemValue("signpole",Cstr(sSignedData))
Msgbox "конец"
End Sub