Информационная безопасность



              

Windows и Delphi на защите секретов (часть 4) - часть 10


  • Открыть системное хранилище сертификатов:
  • {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);




    Содержание  Назад  Вперед