Статус: Эксперт
  Группы: Участники
 Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 397 раз в 367 постах
  
	 
	
     | 
    
        
            
		      
                Смотря какого интерфейса.. COM у меня примера нет, делаю через низкоуровневые функции MS CryptoAPI 2.0. В принципе для данной задачи наверно подойдет и высокоуровневые функции MS CryptoAPI 2.0 Пример кода для Дельфи с использованием модуля JwaWinCrypt (модуль импортирует кучу заголовков из библиотек, желательно скачать версию модуля поновее) можно посмотреть в этой теме:  https://www.cryptopro.ru...aspx?g=posts&t=17082Вкратце, надо: 1. открыть хранилище и найти там нужный сертификат, например, по отпечатку (но можно вывести системное окно выбора сертификата пользователю). Упрощенная выдержка из кода, в buf двоичные данные отпечатка сертификата, bufLen их длина.
 
 Код:const hcs_my=1;hcs_ca=2;hcs_root=3;hcs_spub=4;hcs_myl=5;
function hcStore_Open(index:cardinal):HCERTSTORE;
begin
  if (index>=hcs_my)and(index<=hcs_max) then begin
    if hcertstores[index]=nil then begin
      case index of
        hcs_my:hcertstores[index]:=CertOpenSystemStore(0,'MY'); // hProv: 0=default (xp,2003), 0=rezerved (vista +)
        hcs_ca:hcertstores[index]:=CertOpenSystemStore(0,'CA');
        hcs_root:hcertstores[index]:=CertOpenSystemStore(0,'ROOT');
        hcs_spub:hcertstores[index]:=CertOpenSystemStore(0,'SPUB');
        hcs_myl:hcertstores[index]:=CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,0,CERT_STORE_OPEN_EXISTING_FLAG or CERT_STORE_READONLY_FLAG or CERT_SYSTEM_STORE_LOCAL_MACHINE,Pchar('MY'));
      end;
    end;
    hcStore_Open:=hcertstores[index];
  end else hcStore_Open:=nil; // not supported yet
end;
function FindByHash_(buf:pointer;bufLen:cardinal;hCStore:HCERTSTORE):PCERT_CONTEXT;
var cb:crypt_hash_blob;
CertCont:PCERT_CONTEXT;
res:cardinal;
begin
  CertCont:=nil;
  cb.cbData:=bufLen; // binary, not add #0
  cb.pbData:=buf;
//writeln(stderr,bufLen,' ',viewaddr(buf));
//writeln(stderr,IsBadReadPtr(cb.pbData,cb.cbData));
  SetLastError(0);
  CertCont:=CertFindCertificateInStore(hCStore,X509_ASN_ENCODING or PKCS_7_ASN_ENCODING{enc},0{flag},CERT_FIND_HASH,@cb,nil);
  res:=GetLastError();
  //writeln(stderr,inttohex(res,8));
  // CRYPT_E_NOT_FOUND $80092004
  if res=$80092004 then CertCont:=nil;
  FindByHash_:=CertCont;
end;
...
  hCStore:=hcStore_Open(hcs_my);
  pCert:=FindByHash_(buf,bufLen,hCStore);
... 
 
 
2. заполнить запись параметрами и передать в функцию (в примере в теме по ссылке). Разве что надо сейчас заменить алгоритм на гост-2012. Обнуление структуры обязательно ZeroMemory или FillChar, указание размера структуры обязательно, а вот везде заполнять 0 и nil после обнуления не обязательно. 3. Потом перекодировать результат в base64 (тут уж кто во что горазд, есть функция CryptBinaryToString в JwaWinCrypt, но и в самом Дельфи куча версий кодировщика) 4. Составить запрос и каким-то http компонентом отправить (опять же компонентов несколько) Отредактировано пользователем 28 декабря 2020 г. 12:56:26(UTC)
 | Причина: Не указана  
            
	  
         
     | 
    
        
              1 пользователь поблагодарил two_oceans за этот пост.  
     | 
    
        
     |