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



              

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


  • В неиспользуемые поля вписываем нули и пустые указатели:
  • certInfo.IssuerUniqueId.cbData:= 0; certInfo.IssuerUniqueId.pbData:= nil; certInfo.IssuerUniqueId.cUnusedBits:= 0; certInfo.SubjectUniqueId.cbData:= 0; certInfo.SubjectUniqueId.pbData:= nil; certInfo.SubjectUniqueId.cUnusedBits:= 0; certInfo.cExtension:= 0; certInfo.rgExtension:= nil;

  • Подписываем и кодируем сертификат:
  • {encCertLen: DWORD; encCert: PByte;} CryptSignAndEncodeCertificate (prov, AT_SIGNATURE, encType, X509_CERT_TO_BE_SIGNED, @certInfo, @(certInfo.SignatureAlgorithm), nil, nil, @encCertLen); GetMem (encCert, encCertLen); CryptSignAndEncodeCertificate (prov, AT_SIGNATURE, encType, X509_CERT_TO_BE_SIGNED, @certInfo, @(certInfo.SignatureAlgorithm), nil, encCert, @encCertLen);

  • Сохраняем подписанный и закодированный сертификат в файле, освобождаем память и дескриптор криптопровайдера.
  • Хранение сертификатов

    Созданный сертификат владелец может отправлять своим корреспондентам для организации безопасной связи. Чтобы сделать полученный сертификат доступным системе, его нужно поместить в одно из хранилищ сертификатов. Windows предусматривает существование нескольких системных хранилищ сертификатов: MY (для хранения сертификатов отдельного пользователя), СА (от Certification Authority - для хранения сертификатов центров сертификации) и ROOT (для хранения корневых сертификатов). Открытое (загруженное в память) хранилище сертификатов представляет собой связанный список блоков данных, каждый из которых содержит ссылку на следующий блок и на данные сертификата. Каждое хранилище сертификатов физически размещается либо в отдельном файле, либо в реестре Windows. При этом для работы с системными хранилищами не нужно знать их местоположения - достаточно указать приведенные выше имена.

    Для помещения сохраненного в файле подписанного сертификата в системное хранилище нужно выполнить следующие шаги.

  • Открыть файл и считать его содержимое в буфер.
  • При помощи специальной функции создать контекст сертификата:
  • {encCertLen: DWORD; - размер закодированного сертификата encCert: PByte; - данные сертификата context: PCCERT_CONTEXT; encType: DWORD;} encType:= PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; context:= CertCreateCertificateContext (encType, encCert, encCertLen);




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