| ||||
| ||||
Приведите пожалуйста пример заполнения этих структур, для добавления сертификатов в CRL то что CRL_CONTEXT создается также как и CERT_COTEXT я уже знаю | ||||
Ответы: | ||||
| ||||
Пропущен шаг CryptSignAndEncodeCertificate - подпись CRL ключем центра. CERT_EXTENSION в CRL не очень важны, для отзыва заполнять надо CRL_ENTRY. А вообще, какая задача решается и почему выпуск CRL нельзя доверить CA? | ||||
| ||||
можно и CA доверить, но в целях самообразования хотел бы разобраться как создается список в частности хотя бы маленький примерчик заполнения этих структур какие из них надо кодировать а какие нет | ||||
| ||||
Список создается заполнением массива rgCRLEntry в CRL_INFO. | ||||
| ||||
в струтуре CRL_INFO мне не совсем понятно как заполнять некоторые поля типа : SignatureAlgorithm - какой именно Oid?; cExtension и rgExtension - вы сказали что не обязательны(надо ли заполнять эти поля в CRL_INFO); правильно ли я понимаю что в структуре CRL_INFO надо указать лишь SerialNumber -Сер. номер сертификата и RevocationDate - дату отзыва сертификата? | ||||
| ||||
SignatureAlgorithm - тот, которым будете CRL подписывать. SerialNumber и RevocationDate - это поля CRL_ENTRY. Да, понимаете правильно. | ||||
| ||||
спасибо большое за оказанную помощь теперь стало немного понятно | ||||
| ||||
такая реализация примерно правильная ? store := CertOpenSystemStore(Fhprov, pChar(’MY’)) ; value := ’bla - bla’; GetMem(nameStr,length(value)); StrPCopy(nameStr, value); NameAttr.pszObjId := ’2.5.4.3’; NameAttr.dwValueType := CERT_RDN_PRINTABLE_STRING; NameAttr.Value.cbData := length(value); GetMem(NameAttr.Value.pbData,NameAttr.Value.cbData); move(PBYTE(nameStr)^, NameAttr.Value.pbData^, NameAttr.Value.cbData); // NameAttr.Value.pbData := PBYTE(nameStr); Rdn.cRDNAttr := 1; Rdn.rgRDNAttr := @NameAttr; NameInfo.cRDN := 1; NameInfo.rgRDN := @Rdn; encType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; if not CryptEncodeObject(encType, X509_NAME, @NameInfo, nil, encNameLen) or (encNameLen < 1) then begin MessageDlg(’CryptEncodeObject error ’ + inttostr(GetLastError), mtError, [mbOK], 0); StrDispose(nameStr); exit; end; GetMem(encName, encNameLen); if not CryptEncodeObject(encType, X509_NAME, @NameInfo, encName, encNameLen) or (encNameLen < 1) then begin MessageDlg(’2nd CryptEncodeObject error ’ + inttostr(GetLastError), mtError, [mbOK], 0); StrDispose(nameStr); FreeMem(encName, encNameLen); exit; end; FillChar(params, sizeof(params), 0); CrlInfo.dwVersion := CRL_V1; CrlInfo.SignatureAlgorithm.pszObjId := szOID_OIWSEC_sha1RSASign; CrlInfo.SignatureAlgorithm.Parameters := params; CrlInfo.Issuer.cbData := encNameLen; CrlInfo.Issuer.pbData := encName; Serial := 12345; Entry.SerialNumber.cbData := 4; Entry.SerialNumber.pbData := @Serial; Entry.RevocationDate := DateTimeToFileTime(StrToDate(’05.05.2005’)); CrlInfo.cCRLEntry := 1; CrlInfo.rgCRLEntry := @Entry; CrlContext.dwCertEncodingType := X509_ASN_ENCODING OR PKCS_7_ASN_ENCODING; CrlContext.hCertStore := PChar(’MY’); CrlContext.cbCrlEncoded := 0; CrlContext.pbCrlEncoded := nil; b := CertAddCRLContextToStore(store, @CrlContext, CERT_STORE_ADD_ALWAYS, @OutCrl); if not b then ShowMessage(’Обшибка’); | ||||
| ||||
нет - CRL должен быть подписан с помощью CryptSignAndEncodeCertificate (см 1й пост) так что CrlContext.cbCrlEncoded := 0; CrlContext.pbCrlEncoded := nil; не пройдет | ||||
| ||||
аааа значить надо подписать CRL_INFO и получится закодированный CRL из которого можно фунцией CertCreateCRLContext создать CRL_CONTEXT так получается? | ||||
| ||||
Да, именно так. | ||||