Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Олег Супроненко  
#1 Оставлено : 25 февраля 2020 г. 16:03:48(UTC)
Олег Супроненко

Статус: Новичок

Группы: Участники
Зарегистрирован: 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] - выдает Параметр задан неверно.

Что я не так делаю?
Offline Андрей *  
#2 Оставлено : 25 февраля 2020 г. 16:51:58(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,645
Мужчина
Российская Федерация

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Здравствуйте.

Использовать
Код:

 for i:=1 to oStore.Certificates.Count do

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 25 февраля 2020 г. 16:54:51(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,645
Мужчина
Российская Федерация

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Код:
 result := false;

сильно...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#4 Оставлено : 25 февраля 2020 г. 17:04:51(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,645
Мужчина
Российская Федерация

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Код:
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;
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Олег Супроненко оставлено 25.02.2020(UTC)
Offline Андрей *  
#5 Оставлено : 25 февраля 2020 г. 20:44:12(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,645
Мужчина
Российская Федерация

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Другой вариант, поиск по отпечатку (что надёжнее, чем использовать серийный номер)
Код:


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;

Техническую поддержку оказываем тут
Наша база знаний
Offline two_oceans  
#6 Оставлено : 26 февраля 2020 г. 11:08:52(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Хочется отметить, что когда хранилище открыто только для чтения в низкоуровневых апи перечисление всех сертификатов и сравнение полей каждого сертификата с искомым в программе работает надежнее чем поиск отпечатка внутри апи (который половину сертификатов не находит). Поэтому надежнее скорее сама идея сравнения отпечатков перед сравнением серийных номеров, но уж точно не вызов апи поиска. Хотя, признаюсь, oStore.Certificates.Find не пробовал, возможно он сработает лучше.

Отредактировано пользователем 26 февраля 2020 г. 11:10:35(UTC)  | Причина: Не указана

Offline Андрей *  
#7 Оставлено : 26 февраля 2020 г. 11:58:32(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,645
Мужчина
Российская Федерация

Сказал «Спасибо»: 393 раз
Поблагодарили: 1611 раз в 1238 постах
Автор: two_oceans Перейти к цитате
Хочется отметить, что когда хранилище открыто только для чтения в низкоуровневых апи перечисление всех сертификатов и сравнение полей каждого сертификата с искомым в программе работает надежнее чем поиск отпечатка внутри апи (который половину сертификатов не находит). Поэтому надежнее скорее сама идея сравнения отпечатков перед сравнением серийных номеров, но уж точно не вызов апи поиска. Хотя, признаюсь, oStore.Certificates.Find не пробовал, возможно он сработает лучше.


а примеры есть?
Или какое-то API не выдает сертификат, который есть, но не имеет ссылки на контейнер (или по каким-то причинам (цепочка\срок действия) был "отброшен")?
Т.е. вводит в заблуждение (нет сертификата, хотя он есть в хранилище)?

поставил в My сторонний, просроченный сертификат - находит.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.