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

Уведомление

Icon
Error

4 Страницы«<234
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей *  
#31 Оставлено : 3 июня 2023 г. 21:06:41(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
// Win32Check(dwSize <> 0);

правильно, зачем проверять, пусть потом где-то всплывёт access violation
хотя бы через
Цитата:
if dwSize = 0 then ... что-то пошло не так...

про
getLastError
SysErrorMessage(getLastError()) ещё не забывать...
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Infopol оставлено 04.06.2023(UTC)
Offline Infopol  
#32 Оставлено : 4 июня 2023 г. 9:22:30(UTC)
Infopol

Статус: Активный участник

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

Сказал(а) «Спасибо»: 17 раз
Сделал функцию получения данных сертификата. Не удалось получить только даты действия сертификата.
Код:

function GetCertificateFiles(files,pref:string;var subject,serialnumb:string):Boolean;
 var
        CertMem: TMemoryStream;
  base64Cert:string;
  BPos, EPos: Integer;
  SL: TStringList;
   Base64Stream : TStringStream;
  dwType: DWORD;
 pCert:PCCERT_CONTEXT;

  CertName: array[0..255] of Char;
begin
 result:=false;
 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) ;

          serialnumb:=AnsiUpperCase( DecodeSerialNumber(pCert.pCertInfo.SerialNumber) );
        end;
        Sl.Free;
        CertMem.Free;
        Base64Stream.Free;


 end;


end;



Offline Андрей *  
#33 Оставлено : 4 июня 2023 г. 12:58:50(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: Infopol Перейти к цитате
Сделал функцию получения данных сертификата. Не удалось получить только даты действия сертификата.






Это не функция получения, это прототип для отладки...

А что с датой? Вчера же с этого началось - 19 сообщение в этой теме, там пример...


для тестового xml:
Snimok ehkrana ot 2023-06-04 13-47-53.png (5kb) загружен 6 раз(а).


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))));


Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Infopol оставлено 04.06.2023(UTC)
Offline Infopol  
#34 Оставлено : 4 июня 2023 г. 13:12:24(UTC)
Infopol

Статус: Активный участник

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

Сказал(а) «Спасибо»: 17 раз
Автор: Андрей * Перейти к цитате
Автор: Infopol Перейти к цитате
Сделал функцию получения данных сертификата. Не удалось получить только даты действия сертификата.






Это не функция получения, это прототип для отладки...

А что с датой? Вчера же с этого началось - 19 сообщение в этой теме, там пример...


для тестового xml:
Snimok ehkrana ot 2023-06-04 13-47-53.png (5kb) загружен 6 раз(а).


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)  | Причина: Не указана

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