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



              

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


Для этого следует создать и заполнить структуру CERT_INFO, являющуюся, как сказано в документации, "сердцем сертификата" ( - серым цветом обозначены поля, содержащие закодированную информацию).

  • Подключаемся к контейнеру ключей администратора.
  • Заполняем поля сертификата, представленного структурой CERT_INFO:
  • {certInfo: CERT_INFO; serNum: int64; params: CRYPT_OBJID_BLOB; nameStr: PChar; nameAttr: CERT_RDN_ATTR; rdn: CERT_RDN; nameInfo: CERT_NAME_INFO;} certInfo.dwVersion:= CERT_V1; {версия 1} serNum:= strtoint64(serNumEdit.Text); certInfo.SerialNumber.cbData:= sizeof (serNum); certInfo.SerialNumber.pbData:= @serNum; FillChar (params, sizeof (params), 0); certInfo.SignatureAlgorithm.pszObjId:= szOID_OIWSEC_sha1RSASign; certInfo.SignatureAlgorithm.Parameters:= params; nameStr:= StrAlloc (length (IssuerEdit.text)+1); StrPCopy (nameStr, IssuerEdit.Text); nameAttr.pszObjId:= '2.5.4.3'; nameAttr.dwValueType:= CERT_RDN_PRINTABLE_STRING; nameAttr.Value.cbData:= length (IssuerEdit.text); nameAttr.Value.pbData:= PBYTE (nameStr); rdn.cRDNAttr:= 1; rdn.rgRDNAttr:= @nameAttr; nameInfo.cRDN:= 1; nameInfo.rgRDN:= @rdn;

  • Кодируем строку, содержащую название издателя сертификата:
  • {encNameLen: DWORD; encName: PBYTE; issNameBLOB: CERT_NAME_BLOB;} CryptEncodeObject (encType, X509_NAME, @nameInfo, nil, @encNameLen); GetMem (encName, encNameLen); CryptEncodeObject (encType, X509_NAME, @nameInfo, encName, @encNameLen); issNameBlob.cbData:= encNameLen; issNameBlob.pbData:= encName; certInfo.Issuer:= issNameBLOB;

  • Кодируем даты начала и конца срока действия сертификата:
  • {sysTime: TSystemTime;} DateTimeToSystemTime (StrToDateTime (NotBeforeEdit.Text), sysTime); SystemTimeToFileTime (sysTime, certInfo.notBefore); DateTimeToSystemTime (StrToDateTime (NotAfterEdit.Text), sysTime); SystemTimeToFileTime (sysTime, certInfo.notAfter);

  • Поля сертификата, содержащие информацию о его владельце, заполняем на основании данных, содержащихся в декодированном запросе сертификата:
  • certInfo.Subject:= pCertReqInfo.Subject; certInfo.SubjectPublicKeyInfo:= pCertReqInfo.SubjectPublicKeyInfo;




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