Статус: Новичок
Группы: Участники
Зарегистрирован: 24.02.2020(UTC) Сообщений: 3
Сказал(а) «Спасибо»: 1 раз
|
Здравствуйте! Взял пример из документации по Криптопро. Написан на VB.
Function GetSignerCertificate(SerialNumber) Set GetSignerCertificate = Nothing Dim oCert Dim oStore Set oStore = CreateObject("CAdESCOM.Store") oStore.Open CAPICOM_CURRENT_USER_STORE For Each oCert In oStore.Certificates If oCert.SerialNumber = SerialNumber Then Set GetSignerCertificate = oCert Exit For End If Next End Function
Переписал на Delphi 7.
function getSignnerCertificate(SerialNumber:string):Variant; Const CAPICOM_CURRENT_USER_STORE = 2; var oStore,aa:Variant; i,kk:integer; ss:string; begin result:=false; oStore := CreateOLEObject('CadesCOM.Store'); oStore.Open(CAPICOM_CURRENT_USER_STORE); for i:=0 to oStore.Certificates.Count-1 do begin if oStore.Certificates.Item[i].SerialNumber = SerialNumber then begin result := oStore.Certificates.Item[i]; Exit; end; end; response:='{"result":"error","errorstring":"Sign Certificate not found"}'; end;
В строке oStore.Certificates.Item[i] - выдает Параметр задан неверно.
Что я не так делаю?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,558   Сказал «Спасибо»: 556 раз Поблагодарили: 2262 раз в 1765 постах
|
Здравствуйте. Использовать Код:
for i:=1 to oStore.Certificates.Count do
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,558   Сказал «Спасибо»: 556 раз Поблагодарили: 2262 раз в 1765 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,558   Сказал «Спасибо»: 556 раз Поблагодарили: 2262 раз в 1765 постах
|
Код:function getSignerCertificate(SerialNumber: string): Variant;
const
CAPICOM_CURRENT_USER_STORE = 2;
var
oStore: Variant;
i: integer;
begin
result := Unassigned;
oStore := CreateOLEObject('CAdESCOM.Store');
oStore.Open(CAPICOM_CURRENT_USER_STORE);
for i := 1 to oStore.Certificates.Count - 1 do
if oStore.Certificates.Item[i].SerialNumber = SerialNumber then
begin
result := oStore.Certificates.Item[i];
Exit;
end;
end;
.....
var
Cert: Variant;
begin
Cert := getSignerCertificate('11012C7F00F5AA8594486FE360B11368A7');
if Cert = Unassigned then
begin
ShowMessage('Сертификат не найден...');
exit;
end;
ShowMessage('Отпечаток: ' + Cert.thumbprint);
end;
|
|
 1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,558   Сказал «Спасибо»: 556 раз Поблагодарили: 2262 раз в 1765 постах
|
Другой вариант, поиск по отпечатку (что надёжнее, чем использовать серийный номер) Код:
function GetCertificate(thumbprint: string; var oCertificate: olevariant; var onErr: string): boolean;
const
CAPICOM_MY_STORE = 'MY';
CAPICOM_CERTIFICATE_FIND_SHA1_HASH = $00000000;
var
oStore, oCertificates: olevariant;
x: integer;
begin
onErr := '';
result := false;
try
oStore := CreateOleObject('CAdESCOM.Store');
oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
oCertificates := oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, widestring(thumbprint));
x := oCertificates.Count;
if x = 0 then
begin
onErr := 'Не найден сертификат с отпечатком: [' + thumbprint + ']';
exit;
end;
oCertificate := oCertificates.Item[1]; // oCertificates.Item(1);
result := true;
except
on e: exception do
begin
onErr := 'Не удалось получить доступ к сертификату с отпечатком: [' + thumbprint + '] ' + e.Message;
end;
end;
end;
|
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Хочется отметить, что когда хранилище открыто только для чтения в низкоуровневых апи перечисление всех сертификатов и сравнение полей каждого сертификата с искомым в программе работает надежнее чем поиск отпечатка внутри апи (который половину сертификатов не находит). Поэтому надежнее скорее сама идея сравнения отпечатков перед сравнением серийных номеров, но уж точно не вызов апи поиска. Хотя, признаюсь, oStore.Certificates.Find не пробовал, возможно он сработает лучше. Отредактировано пользователем 26 февраля 2020 г. 11:10:35(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,558   Сказал «Спасибо»: 556 раз Поблагодарили: 2262 раз в 1765 постах
|
Автор: two_oceans  Хочется отметить, что когда хранилище открыто только для чтения в низкоуровневых апи перечисление всех сертификатов и сравнение полей каждого сертификата с искомым в программе работает надежнее чем поиск отпечатка внутри апи (который половину сертификатов не находит). Поэтому надежнее скорее сама идея сравнения отпечатков перед сравнением серийных номеров, но уж точно не вызов апи поиска. Хотя, признаюсь, oStore.Certificates.Find не пробовал, возможно он сработает лучше. а примеры есть? Или какое-то API не выдает сертификат, который есть, но не имеет ссылки на контейнер (или по каким-то причинам (цепочка\срок действия) был "отброшен")? Т.е. вводит в заблуждение (нет сертификата, хотя он есть в хранилище)? поставил в My сторонний, просроченный сертификат - находит. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close