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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Dr.Cuker  
#1 Оставлено : 23 мая 2011 г. 23:29:59(UTC)
Dr.Cuker

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

Группы: Участники
Зарегистрирован: 23.05.2011(UTC)
Сообщений: 4
Откуда: Бурятия

Доброго времени суток. Пишу программу контроля сроков действия сертификата ЭЦП: то есть по дате окончания серта вычисляет сколько дней осталось и за 30 дн. до окончания срока предлагает отправить уведомление абону на адрес эл.почты, указанный в сертификате. Так вот, проблема в том что не могу разобраться с получением даты окончания и e-mail из сертификата. Откопал unit, где выводится серийный номер, по аналогии попытался вывести и нужные мне данные- не вышло. Причем программа не хочет работать с сертификатами в X509 CER- кодировке, то есть даже и сер.номер брать не хочет, с DER- работает нормально. Диплом горит Brick wall

Вот пример найденного мной Unit'a:


Код:
unit GetDataSert;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;

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);
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
Edit1.Text:=(GetSerialNumber(Context));
finally
if not CertFreeCertificateContext(Context) then
ShowMessage(SysErrorMessage(GetLastError));
end;
finally
M.Free;
end;
end;
end;

end.

Offline Kirill Sobolev  
#2 Оставлено : 24 мая 2011 г. 13:53:45(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Причем программа не хочет работать с сертификатами в X509 CER- кодировке, то есть даже и сер.номер брать не хочет, с DER- работает нормально

Надо преобразовать в DER.
Техническую поддержку оказываем тут
Наша база знаний
Offline Dr.Cuker  
#3 Оставлено : 24 мая 2011 г. 16:09:56(UTC)
Dr.Cuker

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

Группы: Участники
Зарегистрирован: 23.05.2011(UTC)
Сообщений: 4
Откуда: Бурятия

Понятно. А как?
Offline Kirill Sobolev  
#4 Оставлено : 24 мая 2011 г. 18:14:20(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
А что такое X509 CER- кодировка?
Техническую поддержку оказываем тут
Наша база знаний
Offline Dr.Cuker  
#5 Оставлено : 24 мая 2011 г. 18:50:25(UTC)
Dr.Cuker

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

Группы: Участники
Зарегистрирован: 23.05.2011(UTC)
Сообщений: 4
Откуда: Бурятия

Серт можно экспортировать из ключа в трех осн.форматах DER-кодировка, BASE64-кодировка и Cryptographic Message Syntax (PKCS#7). Открой любой серт и на вкладке состав нажми копировать в файл- там все увидишь. Примечательно то, если открыть серт в BASE64 кодировке и DER-кодировке в блокноте, например, то основное их отличие в теге в BASE64-ом сетре Begin Certificate и END Certificate. Вот я и думаю, если преобразовывать серт из BASE64 в DER, то можно преобразовать сертификат в текстовое поле и из него исключить данные теги. Прокатит?

Извиняюсь за неправильное преподношении вопроса: под X509 CER-кодировкой имел ввиду серт в BASE64-кодировке.

Отредактировано пользователем 24 мая 2011 г. 18:52:48(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#6 Оставлено : 24 мая 2011 г. 21:58:00(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Примечательно то, если открыть серт в BASE64 кодировке и DER-кодировке в блокноте, например, то основное их отличие в теге в BASE64-ом сетре Begin Certificate и END Certificate. Вот я и думаю, если преобразовывать серт из BASE64 в DER, то можно преобразовать сертификат в текстовое поле и из него исключить данные теги.

Теги, конечно, тоже надо исключить при преобразовании будет, но основное отличие все-таки не в этом.
Думаю, в Дельфи есть какое-нибудь API по преобразованию из base64 в binary и обратно.
Техническую поддержку оказываем тут
Наша база знаний
Offline Dr.Cuker  
#7 Оставлено : 24 мая 2011 г. 22:01:06(UTC)
Dr.Cuker

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

Группы: Участники
Зарегистрирован: 23.05.2011(UTC)
Сообщений: 4
Откуда: Бурятия

Kirill Sobolev написал:
Цитата:

Теги, конечно, тоже надо исключить при преобразовании будет, но основное отличие все-таки не в этом.
Думаю, в Дельфи есть какое-нибудь API по преобразованию из base64 в binary и обратно.


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