Статус: Новичок
Группы: Участники
Зарегистрирован: 23.05.2011(UTC) Сообщений: 4 Откуда: Бурятия
|
Доброго времени суток. Пишу программу контроля сроков действия сертификата ЭЦП: то есть по дате окончания серта вычисляет сколько дней осталось и за 30 дн. до окончания срока предлагает отправить уведомление абону на адрес эл.почты, указанный в сертификате. Так вот, проблема в том что не могу разобраться с получением даты окончания и e-mail из сертификата. Откопал unit, где выводится серийный номер, по аналогии попытался вывести и нужные мне данные- не вышло. Причем программа не хочет работать с сертификатами в X509 CER- кодировке, то есть даже и сер.номер брать не хочет, с DER- работает нормально. Диплом горит Вот пример найденного мной 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.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Причем программа не хочет работать с сертификатами в X509 CER- кодировке, то есть даже и сер.номер брать не хочет, с DER- работает нормально Надо преобразовать в DER. |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.05.2011(UTC) Сообщений: 4 Откуда: Бурятия
|
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
А что такое X509 CER- кодировка? |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Примечательно то, если открыть серт в BASE64 кодировке и DER-кодировке в блокноте, например, то основное их отличие в теге в BASE64-ом сетре Begin Certificate и END Certificate. Вот я и думаю, если преобразовывать серт из BASE64 в DER, то можно преобразовать сертификат в текстовое поле и из него исключить данные теги. Теги, конечно, тоже надо исключить при преобразовании будет, но основное отличие все-таки не в этом. Думаю, в Дельфи есть какое-нибудь API по преобразованию из base64 в binary и обратно. |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.05.2011(UTC) Сообщений: 4 Откуда: Бурятия
|
Kirill Sobolev написал:Цитата: Теги, конечно, тоже надо исключить при преобразовании будет, но основное отличие все-таки не в этом. Думаю, в Дельфи есть какое-нибудь API по преобразованию из base64 в binary и обратно.
ага, попробовал исключить теги открыв серт в блокноте, сохранил. Серт открывается, но кодировка осталась прежняя- не в тегах дело.
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close