Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline exsander  
#1 Оставлено : 4 февраля 2012 г. 22:29:03(UTC)
exsander

Статус: Новичок

Группы: Участники
Зарегистрирован: 13.01.2012(UTC)
Сообщений: 5
Откуда: Россия, Белгородская обл.

Добрый день!
Есть необходимость проверить наличие сертификата в списке отзыва. Для начала решил получить контекст CRL.
Код:

const
  CRL_STORE_NAME = 'CA';
  MY_ENCODING_TYPE = PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
  dwFlags = CERT_STORE_BASE_CRL_FLAG;
 . . .
var
  hCRLStore:HCERTSTORE;
  pCRLContext:PCCRL_CONTEXT;
  crlFindFlag:DWord;
  crlEntry: array of CRL_ENTRY;
  i:integer;
  nameBLOB: CERT_NAME_BLOB;
  nameString: PChar;
  size:DWORD;
begin
  try
    hCRLStore := CertOpenSystemStore( 0, PChar( CRL_STORE_NAME ));
    if ( not assigned( hCRLStore )) then
      Err( Format( 'Ошибка открытия хранилища': %s', [ CRL_STORE_NAME ] ));
    crlFindFlag:= dwFlags;

    pCRLContext:=CertGetCRLFromStore(hCRLStore,nil,nil, @crlFindFlag);
    if ( not assigned( pCRLContext )) then
      Err( Format( 'Ошибка получения CRL: %s', []));

    nameString := StrAlloc(512);
    nameBLOB:= pCRLContext.pCrlInfo.Issuer;
    size := CertNameToStr(MY_ENCODING_TYPE, @nameBlob, CERT_X500_NAME_STR, nameString, 512);
    if size > 1 then
      Memo.Lines.Add(nameString)
     else
      Memo.Lines.Add('Издатель не определен');

    SetLength(crlEntry,pCRLContext.pCrlInfo.cCRLEntry);
    crlEntry:= @pCRLContext.pCrlInfo.rgCRLEntry;
    for i:=0 to pCRLContext.pCRLInfo.cCRLEntry - 1 do begin
      Memo.Lines.Add('1. S/N='+DecodeSerialNumberNew(crlEntry[i].SerialNumber));
    end;
   //Memo.Lines.Add(IntToStr(pCRLContext.pCrlInfo.cCRLEntry));
   //Memo.Lines.Add('1. S/N='+DecodeSerialNumber(@pCRLContext.pCrlInfo.rgCRLEntry.SerialNumber));

После получения контекста обнаружил что в crlEntrу есть серийник только 1 сертификата из 3. По двум оставшимся crlEntrу.SerialNumber.pbData = nil.
Что я делаю не правильно? Заранее спасибо.
Offline Андрей Писарев  
#2 Оставлено : 5 февраля 2012 г. 0:26:40(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
pCRLContext именно тот, который нужен (всего один в хранилище CA)?


т.е. pCRLContext.pCRLInfo.cCRLEntry = 3 так?


думаю здесь "проблема":
Цитата:
crlEntry:= @pCRLContext.pCrlInfo.rgCRLEntry;



Отредактировано пользователем 5 февраля 2012 г. 0:36:49(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline exsander  
#3 Оставлено : 5 февраля 2012 г. 15:21:45(UTC)
exsander

Статус: Новичок

Группы: Участники
Зарегистрирован: 13.01.2012(UTC)
Сообщений: 5
Откуда: Россия, Белгородская обл.

Андрей * написал:
pCRLContext именно тот, который нужен (всего один в хранилище CA)?
т.е. pCRLContext.pCRLInfo.cCRLEntry = 3 так?


да, оснастка КриптоПро показывает только один CRL

Андрей * написал:

думаю здесь "проблема":
crlEntry:= @pCRLContext.pCrlInfo.rgCRLEntry;


В чем она заключается? pCRLContext.pCrlInfo.rgCRLEntry - массив указателей на CRL_ENTRY. Я создаю массив уже из CRL_ENTRY. Никак не пойму, почему для первого элемента pCRLContext.pCrlInfo.rgCRLEntry код работает, а для остальных нет.

Offline Андрей Писарев  
#4 Оставлено : 5 февраля 2012 г. 15:23:50(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
exsander написал:
Андрей * написал:
pCRLContext именно тот, который нужен (всего один в хранилище CA)?
т.е. pCRLContext.pCRLInfo.cCRLEntry = 3 так?


да, оснастка КриптоПро показывает только один CRL






оснастка КриптоПро ?

а certmgr.msc ?

Отредактировано пользователем 5 февраля 2012 г. 15:25:02(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#5 Оставлено : 5 февраля 2012 г. 15:38:37(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
http://msdn.microsoft.co...p/aa376081(v=vs.85).aspx
Цитата:

The CertGetCRLFromStore function gets the first or next certificate revocation list (CRL) context from the certificate store for the specified issuer.
The function also performs the enabled verification checks on the CRL. The new Certificate Chain Verification Functions are recommended instead of this function.


Отредактировано пользователем 5 февраля 2012 г. 16:02:57(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#6 Оставлено : 5 февраля 2012 г. 15:56:43(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Цитата:
crlEntry:= @pCRLContext.pCrlInfo.rgCRLEntry;


Цитата:
В чем она заключается?


Замени на:
pointer(crlEntry):=pCRLContext.pCrlInfo.rgCRLEntry;

и будет "счастье"... (не забудь про поиск нужного контекста CRL (нужного издателя)... )

пример:
05.02.2012 12:57:30.813 CRL_CONTEXT.pCrlInfo.cCRLEntry=51
05.02.2012 12:57:30.813 [0]. S/N=6BCB2D5B000000000050
05.02.2012 12:57:30.813 [1]. S/N=6BC590D500000000004F
....
05.02.2012 12:57:30.828 [49]. S/N=43D50919000000000033
05.02.2012 12:57:30.828 [50]. S/N=37B854F2000000000028



зациклим: http://www.sql.ru/forum/...px?bid=20&tid=915594

Отредактировано пользователем 5 февраля 2012 г. 16:17:02(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline exsander  
#7 Оставлено : 5 февраля 2012 г. 17:39:09(UTC)
exsander

Статус: Новичок

Группы: Участники
Зарегистрирован: 13.01.2012(UTC)
Сообщений: 5
Откуда: Россия, Белгородская обл.

Цитата:
оснастка КриптоПро ?

а certmgr.msc ?

В системе установлен КриптоПро CSP 3.6

Цитата:

Замени на:
pointer(crlEntry):=pCRLContext.pCrlInfo.rgCRLEntry;

и будет "счастье"... (не забудь про поиск нужного контекста CRL (нужного издателя)... )

мдя... как всегда "..а ларчик просто открывался..."

Андрей, огромное спасибо за помощь! Все работает. Сдам проект, буду переделывать под "..new Certificate Chain Verification Functions..."
Offline exsander  
#8 Оставлено : 4 июня 2012 г. 17:39:50(UTC)
exsander

Статус: Новичок

Группы: Участники
Зарегистрирован: 13.01.2012(UTC)
Сообщений: 5
Откуда: Россия, Белгородская обл.

Снова всем доброго дня!

Всплыл новый вопрос.
Есть два сертификата.
1) Субъект: CN = EXSANDER
сер.№ 12 7d ce 90 00 00 00 00 00 55
Издатель: E=test-uc@tii.ru, C=RU, S=moscow, L=moscow, O=Integrator IT, OU=Security of documents, CN=Testing CA
2) Субъект: CN = Вершинина Лариса Степановна
сер.№ 2052 543E 0001 0001 40F8
Издатель: E=ca@center-inform.ru, C=RU, L=Санкт-Петербург, O=ФГУП ЦентрИнформ, OU=Удостоверяющий центр, CN=CentrInform SPb

При использовании
CertFindCertificateInStore( hCertStoreHandle, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_STR, PWideChar(WideString(Edit2.Text)), nil ) находятся оба сертификата

При использовании
CertFindCertificateInStore(hCertStoreHandle, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_CERT, @pCertInfo, nil) только первый.

Вопрос: имеет ли значение порядок и количество параметров которые передаются в структуру Issuer? Может быть причина в этом?


Заранее спасибо.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.