09.08.2005 8:56:25CertAddCRLContextToStore -> CRL_CONTEXT - > CRL_INFO -> CERT_EXTENSION Ответов: 10
raul
Приведите пожалуйста пример заполнения этих структур, для добавления сертификатов в CRL
то что CRL_CONTEXT создается также как и CERT_COTEXT я уже знаю
 
Ответы:
09.08.2005 9:49:31Kirill Sobolev
Пропущен шаг CryptSignAndEncodeCertificate - подпись CRL ключем центра. CERT_EXTENSION в CRL не очень важны, для отзыва заполнять надо CRL_ENTRY.
А вообще, какая задача решается и почему выпуск CRL нельзя доверить CA?
09.08.2005 10:05:34raul
можно и CA доверить,
но в целях самообразования хотел бы разобраться как создается список
в частности хотя бы маленький примерчик
заполнения этих структур какие из них надо кодировать а какие нет
09.08.2005 10:08:07Kirill Sobolev
Список создается заполнением массива rgCRLEntry в CRL_INFO.
09.08.2005 11:01:16raul
в струтуре CRL_INFO
мне не совсем понятно как заполнять
некоторые поля типа :
SignatureAlgorithm - какой именно Oid?;
cExtension и rgExtension - вы сказали что не обязательны(надо ли заполнять эти поля в CRL_INFO);
правильно ли я понимаю что в структуре CRL_INFO надо указать лишь SerialNumber -Сер. номер сертификата и RevocationDate - дату отзыва сертификата?

09.08.2005 11:07:48Kirill Sobolev
SignatureAlgorithm - тот, которым будете CRL подписывать.
SerialNumber и RevocationDate - это поля CRL_ENTRY. Да, понимаете правильно.
09.08.2005 11:29:06raul
спасибо большое за оказанную помощь
теперь стало немного понятно
09.08.2005 13:26:27raul
такая реализация примерно правильная ?

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(&rsquo;CryptEncodeObject error &rsquo; + 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(&rsquo;2nd CryptEncodeObject error &rsquo; + 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(&rsquo;05.05.2005&rsquo;));

CrlInfo.cCRLEntry := 1;
CrlInfo.rgCRLEntry := @Entry;

CrlContext.dwCertEncodingType := X509_ASN_ENCODING OR PKCS_7_ASN_ENCODING;
CrlContext.hCertStore := PChar(&rsquo;MY&rsquo;);
CrlContext.cbCrlEncoded := 0;
CrlContext.pbCrlEncoded := nil;


b := CertAddCRLContextToStore(store,
@CrlContext,
CERT_STORE_ADD_ALWAYS,
@OutCrl);


if not b then
ShowMessage(&rsquo;Обшибка&rsquo;);
09.08.2005 13:30:42Kirill Sobolev
нет - CRL должен быть подписан с помощью CryptSignAndEncodeCertificate (см 1й пост)
так что
CrlContext.cbCrlEncoded := 0;
CrlContext.pbCrlEncoded := nil;
не пройдет
09.08.2005 13:58:01raul
аааа
значить надо подписать CRL_INFO
и получится закодированный CRL
из которого можно фунцией
CertCreateCRLContext
создать CRL_CONTEXT так получается?
10.08.2005 11:45:09Kirill Sobolev
Да, именно так.