Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
На вид все в порядке. Ну своеобразно конечно ищете - весь контекст передаете, по идее отпечатка сертификата достаточно для однозначной идентифицикации сертификата. Отпечаток можно получить из свойства CERT_HASH_PROP_ID (или CERT_SHA1_HASH_PROP_ID) контекста сертификата (buffer это указатель на память, вместо pchar у меня другой тип, соль в том что pchar содержит #0 в конце, а тут возвращается значение двоичное): Код:CertGetCertificateContextProperty(pCertCont,param, PByte(buffer), DataLen)
и заполнить блоб хэша: Код:c.cbData:=DataLen;
c.pbData:=buffer;
искать по блобу хэша Код: CertCont:=CertFindCertificateInStore(hCStore,X509_ASN_ENCODING or PKCS_7_ASN_ENCODING{enc},0{flag},CERT_FIND_HASH,@c,nil);
res:=GetLastError();
writeln(stderr,inttohex(res,8));
// CRYPT_E_NOT_FOUND $80092004
if res=$80092004 then CertCont:=nil;
Другой вопрос, что меня тоже приколы с нахождением функцией CertFindCertificateInStore: 1) уже в какой-то теме расписывал - по поготовленной записи о ExtenededKeyUsage с поиском CERT_FIND_ENHKEY_USAGE вообще ничего не находит (такая же ошибка $80092004), хоть одно назначение указываю, хоть все что есть в сертификате. Хотел автоматом подхватывать новую ЭП-ОВ на ту же организацию после замены сертификата, но пришлось сохранять отпечаток и искать по нему. 2) по отпечатку внезапно отказывается находить в режиме запуска программы от системы (из php в сервисе Apache), в хранилище My компьютера сертификат установлен, причем перечисление сразу же после поиска на том же самом хендле хранилища сертификат показывает, свойства контекста сертификата читаются - значит и сертификат есть и права есть. Отпечаток из перечисленного сертификата побайтово идентичен данным для поиска. В режиме запуска от обычного пользователя по эти данным находит, то есть данные для поиска отпечатка подготовлены верно. НО от системы не находит - флаг для чтения при открытии хранилища как-то мешает поиску? Вот как открываю хранилище для обычного пользователя и для системы: Код:CertOpenSystemStore(0,'MY');
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'));
Для системы по первому варианту тоже открывается, но там конечно ничего нет. В итоге плюнул, переделал через перечисление сертификатов в хранилище и сравнение нужных полей самой программой - в итоге и ExtenededKeyUsage в перечисленном сертификате совпадает с поисковой записью (разница только что CryptoAPI возвращает все в одном куске памяти, а я запрашиваю запись с указателями на другие куски памяти, причем все адреса кусочков памяти проверяю IsBadReadPtr и везде ложь). Отредактировано пользователем 18 февраля 2019 г. 7:40:56(UTC)
| Причина: Не указана
|