Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
Сказал(а) «Спасибо»: 17 раз
|
Автор: Андрей * Автор: Infopol Сделал функцию получения данных сертификата. Не удалось получить только даты действия сертификата.
Это не функция получения, это прототип для отладки... А что с датой? Вчера же с этого началось - 19 сообщение в этой теме, там пример... для тестового xml: Snimok ehkrana ot 2023-06-04 13-47-53.png (5kb) загружен 10 раз(а).ShowMessage('Начало действия: ' + FormatDateTime('yyyy.MM.dd hh:mm:ss', DecodeFileTime(Windows._FILETIME(pCert^.pCertInfo^.NotBefore))) + #13#10 + // 'Завершение : ' + FormatDateTime('yyyy.MM.dd hh:mm:ss', DecodeFileTime(Windows._FILETIME(pCert^.pCertInfo^.NotAfter)))); Нашел ошибку все работает .Финальная часть Код:
unit certificate;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Dialogs,JwaWinCrypt ,EncdDecd ,xpbase64//,wcrypt2
, StdCtrls,StrUtils;
function GetCertificateFiles(files,pref:string;var subject,serialnumb:string):Boolean;
implementation
//Shared;
procedure BinToHexInverted(Buffer, Text: PChar; BufSize: Integer);
const
Convert: Array [0 .. 15] of Char = '0123456789abcdef';
var
ii: Integer;
begin
for ii := BufSize - 1 downto 0 do
begin
Text[0] := Convert[Byte(Buffer[ii]) shr 4];
Text[1] := Convert[Byte(Buffer[ii]) and $F];
Inc(Text, 2);
end;
end;
function DecodeSerialNumber(Source: CRYPT_INTEGER_BLOB): String;
begin
SetLength(Result, Source.cbData * 2);
BinToHexInverted(PChar(Source.pbData), Pointer(Result), Source.cbData);
end;
function DecodeName(Source: CERT_NAME_BLOB;
encType: DWORD = X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
strType: DWORD = CERT_X500_NAME_STR): String;
var
iLength: DWORD;
begin
iLength := CertNameToStr(encType, @Source, strType, nil, 0);
SetLength(Result, iLength);
iLength := CertNameToStr(encType, @Source, strType, Pointer(Result), iLength);
SetLength(Result, iLength);
end;
function FileTime2DateTime(FileTime: TFileTime): TDateTime;
var
LocalFileTime: TFileTime;
SystemTime: TSystemTime;
begin
FileTimeToLocalFileTime(FileTime, LocalFileTime);
FileTimeToSystemTime(LocalFileTime, SystemTime);
Result := SystemTimeToDateTime(SystemTime);
end;
function GetInfo( CertInfo:PCCERT_CONTEXT;dwType, dwFlags: DWORD; pvTypePara: Pointer = nil): AnsiString;
var
dwSize: Dword;
// i: integer;
// pszName: PAnsiChar;
begin
// dwflags := CRYPT_STRING_BASE64REQUESTHEADER;
// dwType:=0;
result := ''; // CertGetNameStringA()
try
dwSize := CertGetNameStringA(CertInfo, dwType, dwFlags, pvTypePara, nil, 0);
if (dwSize <> 0) then
begin
SetLength(Result, dwSize);
//Win32Check(
CertGetNameStringA(CertInfo, dwType, dwFlags, pvTypePara, PAnsiChar(Result), dwSize);
end;
except
SysErrorMessage(getLastError()) ;
end;
end;
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;
function GetCertificateFiles(files,pref:string;var subject,serialnumb:string):Boolean;
type
_FILETIME=TFileTime;
var
CertMem: TMemoryStream;
base64Cert,issuer:string;
BPos, EPos: Integer;
SL: TStringList;
Base64Stream : TStringStream;
dwType: DWORD;
pCert:PCCERT_CONTEXT;
CertName: array[0..255] of Char;
begin
result:=false;
try
if FileExists(files) then
begin
SL := TStringList.Create;
SL.LoadFromFile(files);
BPos := Pos('<'+pref+'X509Certificate>', SL.Text) + Length('<'+pref+'X509Certificate>');
EPos := Pos('</'+pref+'X509Certificate>', SL.Text);
base64Cert := Copy(SL.Text, BPos, EPos - BPos);
Base64Stream := TStringStream.Create(base64Cert);
CertMem := TMemoryStream.Create;
DecodeStream(Base64Stream, CertMem);
pCert := CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, CertMem.Memory, CertMem.Size);
if not Assigned(pCert) then
begin
ShowMessage('Íå âîçìîæíî ïðî÷èòàòü CertCreateCertificateContext');
exit;
end
else
begin
FreeAndNil(CertMem);
result:=True;
dwType := CERT_X500_NAME_STR;
CertGetNameString(pCert,CERT_NAME_RDN_TYPE, 0, PAnsiChar( '1.2.643.100.1'), CertName, 256);
CertGetNameString(pCert, CERT_NAME_ATTR_TYPE,0, PAnsiChar('1.2.643.100.1'),CertName ,256); //ÎÃÃÃ
CertGetNameString(pCert, CERT_NAME_ATTR_TYPE,0, PAnsiChar('1.2.643.100.3'),CertName ,256);
CertGetNameString(pCert, CERT_NAME_ATTR_TYPE,0, PAnsiChar('1.2.643.100.0'),CertName ,256);
dwType := CERT_X500_NAME_STR;
SUBJECT := GetInfo(pCert, CERT_NAME_RDN_TYPE, 0, @dwType) ;
issuer:=String(DecodeName(pCert.pCertInfo.Issuer)) ;
// pCert.pCertInfo.NotBefore;
//serialnumb:=AnsiUpperCase( DecodeSerialNumber(pCert.pCertInfo.SerialNumber) )
serialnumb:=AnsiUpperCase( DecodeSerialNumber(pCert.pCertInfo.SerialNumber) ) +','+
FormatDateTime('dd.mm.yyyy', FileTime2DateTime( Windows._FILETIME(pCert.pCertInfo.NotBefore)))+','+FormatDateTime('dd.mm.yyyy', FileTime2DateTime( Windows._FILETIME(pCert.pCertInfo.NotAfter)))
+';'+'ISSUER '+issuer;;
end;
Sl.Free;
CertMem.Free;
Base64Stream.Free;
end;
except
Exit;
end;
end;
end.
Отредактировано пользователем 5 июня 2023 г. 7:28:16(UTC)
| Причина: Не указана
|