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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline koledas  
#1 Оставлено : 30 ноября 2009 г. 18:40:54(UTC)
koledas

Статус: Участник

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 12
Мужчина
Откуда: кемерово

Помогите пожалуйста Pray Я пока новичок, поэтому если можно то по подробнее...
Как получить список OIDов улучшенного ключа сертификата???
Дошел до следующего:
Код:

var
        s:string;

        f: file;
        encCert: PByte;
        encCertLen: DWORD;
        context: PCCertContext;

        size: PDWORD;
        usage: PCertEnhKeyUsage;
begin

AssignFile(f, 'temp.cer');
reset(f, 1);
encCertLen := FileSize(f);
GetMem(encCert, encCertLen);
BlockRead(f, encCert^, encCertLen);
CloseFile(f);


context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
if context <> nil then
begin

CertGetEnhancedKeyUsage(context, 0, usage, size);

end;
CertFreeCertificateContext(context);
FreeMem(encCert, encCertLen);

Как вытащить данные(список OID) из "usage"? желательно в строковую переменную.
Offline Kirill Sobolev  
#2 Оставлено : 30 ноября 2009 г. 19:52:40(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
CERT_ENHKEY_USAGE - это структура, содержащая массив OID в виде строк rgpszUsageIdentifier размером cUsageIdentifier.
Техническую поддержку оказываем тут
Наша база знаний
Offline koledas  
#3 Оставлено : 1 декабря 2009 г. 8:23:00(UTC)
koledas

Статус: Участник

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 12
Мужчина
Откуда: кемерово

Я это понимаю. Не могу с указателями и с размерностью разобраться...
На C попроще как-то, но вот delphi... а нужен код на нем...

вообщем в теории я понимаю что вначале нужно выделить место под usage
затем CertGetEnhancedKeyUsage(context, 0, usage, size);
а уже после доставать данные из usage
но у меня даже не получается обратиться к rgpszUsageIdentifier как к массиву
может я не правильно объявляю переменные?
мастера delphi помогите... на C примеров куча, а на delphi ни одного...
Offline Алексей Завьялов  
#4 Оставлено : 3 декабря 2009 г. 14:53:16(UTC)
Алексей Завьялов

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

Группы: Участники
Зарегистрирован: 26.11.2009(UTC)
Сообщений: 7

Смотрим описание структуры в мсдне
typedef struct _CTL_USAGE {
DWORD cUsageIdentifier;
LPSTR *rgpszUsageIdentifier;
}CTL_USAGE, *PCTL_USAGE, CERT_ENHKEY_USAGE, *PCERT_ENHKEY_USAGE;

Второй параметр указатель на массив укзателей char* или в дельфи PChar
Если не хочется заморачиваться с указателями можно написать так

type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;


парметр LPSTR *rgpszUsageIdentifier в дельфи есть типа PCharArr, только, чтобы хорошо работало, надо убрать при сборке флаг на проверку выхода за границы
Offline koledas  
#5 Оставлено : 3 декабря 2009 г. 22:45:54(UTC)
koledas

Статус: Участник

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 12
Мужчина
Откуда: кемерово

Большое спасибо за ответ, но у меня так и не получается...
Думаю уже близок, дошел до нижеследующего.
Уверен, что написал чёпопало, но может Вам так легче объяснить мне будет Anxious

Код:

procedure TForm1.Button1Click(Sender: TObject);
type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
var
        f: file;
        encCert: PByte;
        encCertLen: DWORD;
        context: PCCertContext;

        size: PDWORD;
        usage: PCertEnhKeyUsage;
begin
	AssignFile(f, 'temp.cer');
	reset(f, 1);
	encCertLen := FileSize(f);
	GetMem(encCert, encCertLen);
	BlockRead(f, encCert^, encCertLen);
	CloseFile(f);

	context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
	if context <> nil then
	begin
	  try
		CertGetEnhancedKeyUsage(context, 0, usage, size);
		showmessage(PCharArr(usage.rgpszUsageIdentifier)[0]);
	  finally
		FreeMem(usage);
	  end;

	end;
	CertFreeCertificateContext(context);
	FreeMem(encCert, encCertLen);
end;


вываливается в ошибку...
Offline Kirill Sobolev  
#6 Оставлено : 4 декабря 2009 г. 14:17:21(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Правильно.
CertGetEnhancedKeyUsage надо вызвать 2 раза - сначала для определения размера структуры, которая будет возвращена, затем уже собственно для получения самой структуры.
Техническую поддержку оказываем тут
Наша база знаний
Offline koledas  
#7 Оставлено : 4 декабря 2009 г. 20:42:25(UTC)
koledas

Статус: Участник

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 12
Мужчина
Откуда: кемерово

Честное слово пытался так сделать, вот так:

Код:

procedure TForm1.Button1Click(Sender: TObject);
type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
var
        f: file;
        encCert: PByte;
        encCertLen: DWORD;
        context: PCCertContext;

        size: PDWORD;
        usage: PCertEnhKeyUsage;
begin
    AssignFile(f, 'temp.cer');
    reset(f, 1);
    encCertLen := FileSize(f);
    GetMem(encCert, encCertLen);
    BlockRead(f, encCert^, encCertLen);
    CloseFile(f);

    context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
    if context <> nil then
    begin
      try
        CertGetEnhancedKeyUsage(context, 0, nil, size);
        GetMem(usage,DWORD(size));
        CertGetEnhancedKeyUsage(context, 0, usage, size);
        showmessage(PCharArr(usage.rgpszUsageIdentifier)[0]);
      finally
        FreeMem(usage);
      end;

    end;
    CertFreeCertificateContext(context);
    FreeMem(encCert, encCertLen);
end;


и всё равно валится в ошибку...
Может кто-нибудь сжалиться и выложит рабочий код... сил уже нет...по моему всё перепробовал...
Pray
Offline AJIEKCAHDP  
#8 Оставлено : 7 декабря 2009 г. 12:11:42(UTC)
AJIEKCAHDP

Статус: Участник

Группы: Участники
Зарегистрирован: 04.06.2008(UTC)
Сообщений: 15

Странно, почему Вы не проверяете usage.cUsageIdentifier перед обращением к usage.rgpszUsageIdentifier.
Может там и нет элементов вовсе.

"If the cUsageIdentifier member is zero, the certificate might be valid for all uses or the certificate might have no valid uses. The return from a call to GetLastError can be used to determine whether the certificate is good for all uses or for none. If GetLastError returns CRYPT_E_NOT_FOUND, the certificate is good for all uses. If it returns zero, the certificate has no valid uses."

Отредактировано пользователем 7 декабря 2009 г. 12:12:56(UTC)  | Причина: Не указана

Offline koledas  
#9 Оставлено : 8 декабря 2009 г. 20:57:03(UTC)
koledas

Статус: Участник

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 12
Мужчина
Откуда: кемерово

Огромное всем спасибо!!! Applause
получилось!!! надо было изначально адрес переменной size брать (@size)

Код:

procedure TForm1.Button1Click(Sender: TObject);
type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
var
        i: Integer;

        f: file;
        encCert: PByte;
        encCertLen: DWORD;
        context: PCCertContext;

        size: PDWORD;
        usage: PCertEnhKeyUsage;
begin
    AssignFile(f, 'temp.cer');
    reset(f, 1);
    encCertLen := FileSize(f);
    GetMem(encCert, encCertLen);
    BlockRead(f, encCert^, encCertLen);
    CloseFile(f);

    context := CertCreateCertificateContext(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, encCert, encCertLen);
    if context <> nil then
    begin
      try
        CertGetEnhancedKeyUsage(context, 0, nil, @size);
        GetMem(usage,DWORD(size));
        CertGetEnhancedKeyUsage(context, 0, usage, @size);

        for i:=0 to usage.cUsageIdentifier-1 do
        begin
          showmessage(PCharArr(usage.rgpszUsageIdentifier)[i]);
        end;

      finally
        FreeMem(usage);
      end;

    end;
    CertFreeCertificateContext(context);
    FreeMem(encCert, encCertLen);
end;

Отредактировано пользователем 8 декабря 2009 г. 21:00:02(UTC)  | Причина: Не указана

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