Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Смотря какого интерфейса.. 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 за этот пост.
|
|