Урра, любимый VB6
Автор: Семён 
Здравствуйте!
Появилась проблема с привязыванием сертификата к контейнеру закрытого ключа в vb6. Контейнер создается ранее, направляется запрос в УЦ на обновление сертификата, по которому получаю сертификат и привязываю его к контейнеру.
Ранее для привязки использовал библиотеку capicom, вот выдержка из кода:
Call oPrivateKeyNew.Open(containerName, PROVIDER_NAME, PROV_GOST_2001_DH, CAPICOM_KEY_SPEC_SIGNATURE, CAPICOM_CURRENT_USER_STORE, False)
oCertificateNew.PrivateKey = oPrivateKeyNew
Все прекрасно работало, но недавно свойство PrivateKey (CAPICOM.PrivateKey) объекта oCertificateNew (CAPICOM.certificate) стало недоступным: <Объект или свойство не найдено>
>Пытаюсь сделать то же самое средствами crypto api:
>Мне кажется, проблема либо в заполнении структуры CRYPT_KEY_PROV_INFO
Я бы сказал в объявлении, работать с указателями на VB6 можно, но сложно.
Поищите "Динамические массивы VB6" Была такая статья. Найду ссылку -свистну.
Там хорошо рассказано про указатели.
Private Type CRYPT_KEY_PROV_INFO
pwstringContainerName As long 'String * 200
pwstringProvName As long 'String * 200
longProvType As Long
longFlags As Long
longProvParam As Long
rgProvParam as long 'As CRYPT_KEY_PROV_PARAM
longKeySpec As Long
End Type
Далее про широкие строки. Если надо передать именно wstring, то
Dim b() as byte
b = "NewContainerName"
provinfo.pwstringContainerName = varptr(b(0))
А если нужна простая строка
b = strconv("NewContainerName", vbfromunicode)
Конечно цикл по всем сертификатам - плохая идея.
Находим нужный, по имени или как вам нравится.
Есть ли закрытый ключ? Что может быть проще:
if pcert.HasPrivateKey then
>Подскажите, пожалуйста, какие функции и в какой последовательности необходимо вызвать,
>чтобы связать конкретный сертификат с конкретным контейнером?
Тут я могу наврать, пусть меня поправят.
Если сертификат помещен в хранилище, то подложить ему другой контейнер нельзя, криминал получается.
Вроде надо поступать так:
Найти ранее созданный контейнер, взять из него ссылку на закрытый ключ.
взять контейнер из сертификата, прописать в него полученную ссылку.
Как я понял из MSDN контейнеры и ключи это базы, а не структуры.
Цитата:И почему могли появиться проблемы с capicom?
А когда и что предшествовало? Сам capicom вроде уж лет пять неизменен.
Если была установка новой версии криптопро, то ответ очевиден.
Борис