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



              

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


  • Проверяем, задано ли нестандартное имя контейнера, и подключаемся к криптопровайдеру.
  • Открываем файл с закодированным запросом сертификата и считываем его содержимое в память (указатель reqEncoded).
  • Декодируем запрос:
  • {encType, size, rsize: DWORD; buf: PBYTE;} encType:= PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; GetMem (buf, 2048); rsize:= 2048; CryptDecodeObject (encType, X509_CERT, reqEncoded, size, 0, buf, @rsize);

  • В декодированном запросе выделяем и декодируем информацию, предназначенную для подписания - уже знакомую нам структуру CERT_REQUEST_INFO:
  • {p: pointer; signedContent: PCERT_SIGNED_CONTENT_INFO; DERBLOB: CRYPT_DER_BLOB; buf2: PBYTE; pCertReqInfo: PCERT_REQUEST_INFO;} p:= buf; signedContent:= p; DERBLOB:= signedContent^.toBeSigned; rsize:= 512; GetMem (buf2, rsize); CryptDecodeObject (encType, X509_CERT_REQUEST_TO_BE_SIGNED, DERBLOB.pbData, DERBLOB.cbData, 0, buf2, @rsize); p:= buf2; pCertReqInfo:= p;

  • Извлекаем из полученной информации строку с именем (названием) владельца сертификата, чтобы отобразить ее на форме:
  • {subjNameBLOB: CERT_NAME_BLOB; subjNameString: PChar;} subjNameBLOB:= pCertReqInfo^.Subject; rsize:= CertNameToStr (encType, @subjNameBLOB, CERT_SIMPLE_NAME_STR, subjNameString, 512); subjectEdit.Text:= subjNameString;

  • Проверяем подпись под запросом сертификата:
  • signCheckBox.Checked:= CryptVerifyCertificateSignature(prov, encType, reqEncoded, size, @(pCertReqInfo^.SubjectPublicKeyInfo));

  • Напоследок - заполняем поля формы "Действителен с" и "Действителен по" текущей датой и датой, отстоящей на год вперед:
  • NotBeforeEdit.Text:= DateTimeToStr (Now); NotAfterEdit.Text:= DateTimeToStr (Now + 365);

  • Освобождаем выделенную память и отключаемся от криптопровайдера.
  • После того, как пользователь убедился в правильности подписи под запросом, откорректировал при необходимости срок действия создаваемого сертификата, указал его серийный номер, вписал название издателя (администратора, центра сертификации) и указал в поле "Контейнер" имя контейнера ключей администратора, начинаем процесс подписания.


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