Функции CertAddCertificateContextToStore, кроме дескрипторов хранилища
{store: HCERTSTORE;} store:= CertOpenSystemStore (0, 'MY');
n:= nil; CertAddCertificateContextToStore (store, context, CERT_STORE_ADD_REPLACE_EXISTING, n)
Функции CertAddCertificateContextToStore, кроме дескрипторов хранилища и добавляемого контекста сертификата, передается параметр, определяющий действия системы в том случае, если в данном хранилище уже имеется идентичный сертификат. Использованная константа CERT_STORE_ADD_REPLACE_EXISTING предписывает в таком случае удалить старый сертификат и заменить его новым. Последний параметр функции позволяет получить указатель на указатель на копию сертификата, созданную при добавлении контекста в хранилище (если параметр равен пустому указателю, то ссылка не возвращается).
CertCloseStore (store, 0); CertFreeCertificateContext (context); FreeMem (encCert, encCertLen);
Просмотреть имеющиеся в хранилище сертификаты можно с помощью функции CertEnumCertificatesInStore. Ей нужно передать дескриптор нужного хранилища и, при первом вызове, пустой указатель, а при последующих - указатель на предыдущий сертификат. Например, для просмотра содержимого одного из системных хранилищ сертификатов может быть использован следующий фрагмент программы (форма, из которой он вызывается, с результатами работы показана на ):
{store: HCERTSTORE; cont, stor: PChar; err: string; cert: PCCERT_CONTEXT; nameString: PChar; size: DWORD; nameBLOB: CERT_NAME_BLOB; подключение к криптопровайдеру считается выполненным!} err:= CertStoreBox.Text; RepMemo.Lines.Add (''); RepMemo.Lines.Add ('===================='); RepMemo.Lines.Add ('Contents of store ' + err); RepMemo.Lines.Add ('===================='); stor:= StrAlloc (length (err) + 1); StrPCopy (stor, err); store:= CertOpenSystemStore (prov, stor); cert:= CertEnumCertificatesInStore (store, nil); nameString:= StrAlloc (512); while cert <> nil do begin RepMemo.Lines.Add ('---------------'); RepMemo.Lines.Add ('Subject:'); nameBLOB:= cert^.pCertInfo^.Subject; size:= CertNameToStr (encType, @nameBlob, CERT_SIMPLE_NAME_STR, nameString, 512); if size > 1 then RepMemo.Lines.Add (nameString) else RepMemo.Lines.Add ('Error'); RepMemo.Lines.Add ('Issuer:'); nameBLOB:= cert^.pCertInfo^.Issuer; size:= CertNameToStr (encType, @nameBlob, CERT_SIMPLE_NAME_STR, nameString, 512); if size > 1 then RepMemo.Lines.Add (nameString) else RepMemo.Lines.Add ('Error'); cert:= CertEnumCertificatesInStore (store, cert); end; StrDispose (nameString);
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий