Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сертификат .Cer, Помогите с исходнимком... 
V
    Опции темы
ivanfr
Дата 25.2.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Проблема следующая. Есть исходник, с помощью которого можно получить данные из сертификата. Но конкретно данный исходник выдирает только серийный номер, хотя помещает в память все данные по сертификату. я хотел бы вытащить дату создания и дату окончания действия. субъекта то есть  имя и почту. а я знаю что субъект- как бы разбит на E-почта,CN-фио,OU,O,L  поля.



function GetSerialNumber(CertInfo: PCCERT_CONTEXT): String;
begin

  Result := ByteArrayToStr(CertInfo.pCertInfo.Subject.pbData,
    CertInfo.pCertInfo.Subject.cbData);
если я модифицирую это строку таким образом, то он он перекодирует в 16 систему. а мне нужны данные Subject типа [email protected] Иванов И.П., то есть в обычном, нормальном представлении.  CertInfo.pCertInfo.Subject.pbData,СertInfo.pCertInfo.Subject.cbData как я понял данные в двоичной форме

  end;

Как можно преобразовать даные?

   
Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 CRYPTOAPI_BLOB = packed record
    cbData: DWORD;
    pbData: PByte;
  end;
  CRYPT_INTEGER_BLOB = CRYPTOAPI_BLOB;
  CRYPT_OBJID_BLOB = CRYPTOAPI_BLOB;
  CERT_NAME_BLOB = CRYPTOAPI_BLOB;
  CRYPT_ALGORITHM_IDENTIFIER = packed record
    pszObjId: LPSTR;
    Parameters: CRYPT_OBJID_BLOB;
  end;
  CRYPT_BIT_BLOB = packed record
    cbData: DWORD;
    pbData: PBYTE;
    cUnusedBits: DWORD;
  end;
  CERT_PUBLIC_KEY_INFO = packed record
    Algorithm: CRYPT_ALGORITHM_IDENTIFIER;
    PublicKey: CRYPT_BIT_BLOB;
  end;
  CERT_EXTENSION = packed record
    pszObjId:  LPSTR;
    fCritical: BOOL;
    Value: CRYPT_OBJID_BLOB;
  end;
  PCERT_EXTENSION = ^CERT_EXTENSION;
  TARR_CERT_EXTENSION = PCERT_EXTENSION;

  CERT_INFO = packed record
    dwVersion: DWORD;
    SerialNumber: CRYPT_INTEGER_BLOB;
    SignatureAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
    Issuer: CERT_NAME_BLOB;
    NotBefore: FILETIME;
    NotAfter: FILETIME;
    Subject: CERT_NAME_BLOB;
    SubjectPublicKeyInfo: CERT_PUBLIC_KEY_INFO;
    IssuerUniqueId: CRYPT_BIT_BLOB;
    SubjectUniqueId: CRYPT_BIT_BLOB;
    cExtension: DWORD;
    rgExtension: TARR_CERT_EXTENSION;
  end;
  PCERT_INFO = ^CERT_INFO;

  HCERTSTORE = Pointer;
  HCRYPTPROV = ULONG;

  CERT_CONTEXT = packed record
    dwCertEncodingType: DWORD;
    pbCertEncoded: PBYTE;
    cbCertEncoded: DWORD;
    pCertInfo: PCERT_INFO;
    hCertStore: HCERTSTORE;
  end;
  PCERT_CONTEXT = ^CERT_CONTEXT;
  PCCERT_CONTEXT = ^CERT_CONTEXT;

function CertFreeCertificateContext(pCertContext:
  PCCERT_CONTEXT): BOOL; stdcall external 'crypt32.dll';

function CertCreateCertificateContext(dwCertEncodingType: DWORD;
  pbCertEncoded: PBYTE; cbCertEncoded: DWORD): PCCERT_CONTEXT; stdcall
  external 'crypt32.dll';

const
  X509_ASN_ENCODING = $00000001;
  PKCS_7_ASN_ENCODING = $00010000; 

var
  Form1: TForm1;

implementation

{$R *.dfm}
function ByteArrayToStr(pbData: PByte; cbData: DWORD): String;
var
  I, J: Integer;
  S: String;
begin
  Result := '';
  if not Assigned(pbData) or (cbData <= 0) then
    Exit;
  for I := 0 to cbData - 1 do
  begin
    J := PByteArray(pbData)^[I];
    S := IntToHex(J, 2);
    if (I > 0) and (I and 1 = 0) then
      S := S + ' ';
    Result := S + Result;
  end;
end;

function GetSerialNumber(CertInfo: PCCERT_CONTEXT): String;
begin

 // Result := ByteArrayToStr(CertInfo.pCertInfo.SerialNumber.pbData,
   // CertInfo.pCertInfo.SerialNumber.cbData);
  Result := ByteArrayToStr(CertInfo.pCertInfo.Subject.pbData,
    CertInfo.pCertInfo.Subject.cbData);

  end;


procedure TForm1.Button1Click(Sender: TObject);
  var
  Context: PCCERT_CONTEXT;
  M: TMemoryStream;
begin
  if OpenDialog1.Execute then
  begin
    M := TMemoryStream.Create;
    try
      M.LoadFromFile(OpenDialog1.FileName);
      Context := CertCreateCertificateContext(X509_ASN_ENCODING or
        PKCS_7_ASN_ENCODING, M.Memory, M.Size);
      if Assigned(Context) then
      try
        ShowMessage(GetSerialNumber(Context));
        //ShowMessage(Get);


      finally
        if not CertFreeCertificateContext(Context) then
          ShowMessage(SysErrorMessage(GetLastError));
      end;
    finally
      M.Free;
    end;
  end;
end;
end.




Это сообщение отредактировал(а) ivanfr - 25.2.2010, 10:10
PM MAIL   Вверх
ivanfr
Дата 1.3.2010, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Проблему решил теперь выводятся нужные поля Subject, notbefore, notafter, Issuer
исходник немного косячный, но работает вроде стабильно.
Проверяем, на косяки помогаем довести до ума.
Код

unit EnumCert;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, wcrypt2;

type
  TEnumCertForm = class(TForm)
    RepMemo: TMemo;
    EnumButton: TButton;
    OpenDialog1: TOpenDialog;
    procedure EnumButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  EnumCertForm: TEnumCertForm;

implementation

{$R *.DFM}

procedure TEnumCertForm.EnumButtonClick(Sender: TObject);
  var
    prov: HCRYPTPROV;
    store: HCERTSTORE;
    cont, stor: PChar;
    err: string;
    cert: PCCERT_CONTEXT;
    nameString: PChar;
    size: DWORD;
    size2: DWORD;
    nameBLOB: CERT_NAME_BLOB;
    notbeforep: TFILETIME;
    notbeforep1:Longint;
    systemTime:TSYSTEMTIME;
    encType: DWORD;
    M: TMemoryStream;
    nameString1:string;
    d1,d:TDateTime;
begin
    encType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
    RepMemo.Lines.Add('');
    RepMemo.Lines.Add('====================');
    RepMemo.Lines.Add('Contents of file ' + err);
    RepMemo.Lines.Add('====================');
  if OpenDialog1.Execute then
    begin
      M := TMemoryStream.Create;
      try
      M.LoadFromFile(OpenDialog1.FileName);
      cert := CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, M.Memory, M.Size);
      if Assigned(cert) then
      try
      nameString := StrAlloc(512);
      RepMemo.Lines.Add('---------------');
      RepMemo.Lines.Add('Subject:');
      nameBLOB := cert^.pCertInfo^.Subject;
      FileTimeToSystemTime(cert^.pCertInfo^.NotBefore, &systemTime);
      d:=SystemTimeToDateTime(SystemTime);
      RepMemo.Lines.Add(FormatDateTime('dd.mm.yyyy', SystemTimeToDateTime(SystemTime)));
      FileTimeToSystemTime(cert^.pCertInfo^.NotAfter, &systemTime);
      d1:=SystemTimeToDateTime(SystemTime);
      RepMemo.Lines.Add(FormatDateTime('dd.mm.yyyy', SystemTimeToDateTime(SystemTime)));
      size := CertNameToStr(encType, @nameBlob, CERT_SIMPLE_NAME_STR, nameString, 512);
      nameString1:= PChar(@notbeforep);
      if size > 1 then RepMemo.Lines.Add(nameString)
      else
          RepMemo.Lines.Add('Error');
          RepMemo.Lines.Add('Issuer:');
          nameBLOB := cert^.pCertInfo^.Issuer;
          size := CertNameToStr(encType, @nameBlob, CERT_SIMPLE_NAME_STR,  nameString, 512);
      if size > 1 then RepMemo.Lines.Add(nameString)
      else
          RepMemo.Lines.Add('Error');
    finally
        if not CertFreeCertificateContext(cert) then
          ShowMessage(SysErrorMessage(GetLastError));
      end;
    finally
      M.Free;
    end;
    end;
end;

end.


Присоединённый файл ( Кол-во скачиваний: 28 )
Присоединённый файл  icxodnik.rar 356,19 Kb
PM MAIL   Вверх
ivanfr
Дата 1.3.2010, 07:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



Жду ваших комментариев.

Присоединённый файл ( Кол-во скачиваний: 75 )
Присоединённый файл  icxodnik.rar 356,19 Kb
PM MAIL   Вверх
ivanfr
Дата 10.3.2010, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 1.4.2009

Репутация: нет
Всего: нет



если хотите чтобы поля выодились как X 509

CN=Иванов И.И.         
O=Рога и копыта         
OU=Отдел сопровождения          
E= [email protected]      
C= RU        
L=Москва
Если поменять эту строчку size := CertNameToStr(encType, @nameBlob, CERT_X500_NAME_STR, nameString, 512);  
то в nameString будет лежать, примерно, следующее "CN=Иванов И.И., O=Рога и копыта, OU=Отдел сопровождения, [email protected], C=RU, L=Москва".  

а вообще там можно использовать 3 параметра:
CERT_SIMPLE_NAME_STR; тут будет лежать строка с данными о субъекте 
CERT_OID_NAME_STR; с версиями..
CERT_X500_NAME_STR. 


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1996 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.