Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
  Сказал(а) «Спасибо»: 17 раз
  
	 
	
     | 
    
        
            
		      
                Автор: Андрей *  Автор: Infopol  Сделал функцию получения данных сертификата. Не удалось получить только даты действия сертификата.  
   
   Это не функция получения, это прототип для отладки... А что с датой? Вчера же с этого началось -  19 сообщение в этой теме, там пример... для тестового xml:   Snimok ehkrana ot 2023-06-04 13-47-53.png  (5kb) загружен 12 раз(а).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)
 | Причина: Не указана  
            
	  
         
     |