Форум КриптоПро
	 » 
	Средства криптографической защиты информации
	 » 
	Встраивание
	 » 
	Программно получить данные из эцп X509Certificate Base64Binary в Delphi 7
	 
	
        
            
            
    
        
	Статус: Сотрудник
  Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,987   Сказал «Спасибо»: 605 раз Поблагодарили: 2350 раз в 1846 постах
  
	 
	
     | 
    
        
            
		      
                а что не получилось то? на какой строчке ошибка? 1.2.643.100.4 ИНН,  КПП в сертификате - нет (исключаем частный случай с текстовым атрибутом, в котором он может быть) Код:
   dwType := CERT_OID_NAME_STR;
   OID_NAME_STR := GetCertAnsiString(CERT_NAME_RDN_TYPE, 0, @dwType);
   INNLE := Get_OID(OID_NAME_STR, '1.2.643.100.4'); // Приказ ФСБ от 29.01.2021 - ИНН ЮЛ с 01.09.2021 в сертификатах
в GetCertAnsiString вызов CertGetNameStringA  для получения строки 
Get_OID - парсинг строки для поиска значения OID  
    | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
  Сказал(а) «Спасибо»: 17 раз
  
	 
	
     | 
    
        
            
		      
                Автор: Андрей *  а что не получилось то? на какой строчке ошибка? 1.2.643.100.4 ИНН,  КПП в сертификате - нет (исключаем частный случай с текстовым атрибутом, в котором он может быть) Код:
   dwType := CERT_OID_NAME_STR;
   OID_NAME_STR := GetCertAnsiString(CERT_NAME_RDN_TYPE, 0, @dwType);
   INNLE := Get_OID(OID_NAME_STR, '1.2.643.100.4'); // Приказ ФСБ от 29.01.2021 - ИНН ЮЛ с 01.09.2021 в сертификатах
в GetCertAnsiString вызов CertGetNameStringA  для получения строки 
Get_OID - парсинг строки для поиска значения OID  
  Код:
SL := TStringList.Create;
   M := TMemoryStream.Create;
 if OpenDialog1.Execute then
 SL.LoadFromFile(OpenDialog1.FileName);
  Memo1.Clear;
  BPos := Pos('<'+Edit1.Text+'X509Certificate>', SL.Text) + Length('<'+Edit1.Text+'X509Certificate>');
 EPos := Pos('</'+Edit1.Text+'X509Certificate>', SL.Text);
 Value := ToBase64( Copy(SL.Text, BPos, EPos - BPos));
   SL.Clear;
  SL.Text:=( Value) ;
   SL.SaveToStream(M);
 Memo1.Lines.Add(Value);
 //CertCreateCertificateContext(        https://www.cyberforum.ru/delphi/thread302892.html
 {CertCreateCertificateContext(X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, M.Memory, M.Size);}
  pCert:= CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PByte(M.Memory),M.Size);
 
      dwType := CERT_OID_NAME_STR;
             CertGetNameString(pCert, CERT_NAME_RDN_TYPE, 0, PAnsiChar( '1.2.643.100.4'), CertName, 256) ; //Тут ошибка
 
  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Сотрудник
  Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,987   Сказал «Спасибо»: 605 раз Поблагодарили: 2350 раз в 1846 постах
  
	 
	
     | 
    
        
            
		      
                Автор: Infopol  Автор: Андрей *  а что не получилось то? на какой строчке ошибка? 1.2.643.100.4 ИНН,  КПП в сертификате - нет (исключаем частный случай с текстовым атрибутом, в котором он может быть) Код:
   dwType := CERT_OID_NAME_STR;
   OID_NAME_STR := GetCertAnsiString(CERT_NAME_RDN_TYPE, 0, @dwType);
   INNLE := Get_OID(OID_NAME_STR, '1.2.643.100.4'); // Приказ ФСБ от 29.01.2021 - ИНН ЮЛ с 01.09.2021 в сертификатах
в GetCertAnsiString вызов CertGetNameStringA  для получения строки 
Get_OID - парсинг строки для поиска значения OID  
  Код:
SL := TStringList.Create;
   M := TMemoryStream.Create;
 if OpenDialog1.Execute then
 SL.LoadFromFile(OpenDialog1.FileName);
  Memo1.Clear;
  BPos := Pos('<'+Edit1.Text+'X509Certificate>', SL.Text) + Length('<'+Edit1.Text+'X509Certificate>');
 EPos := Pos('</'+Edit1.Text+'X509Certificate>', SL.Text);
 Value := ToBase64( Copy(SL.Text, BPos, EPos - BPos));
   SL.Clear;
  SL.Text:=( Value) ;
   SL.SaveToStream(M);
 Memo1.Lines.Add(Value);
 //CertCreateCertificateContext(        https://www.cyberforum.ru/delphi/thread302892.html
 {CertCreateCertificateContext(X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, M.Memory, M.Size);}
  pCert:= CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PByte(M.Memory),M.Size);
 
      dwType := CERT_OID_NAME_STR;
             CertGetNameString(pCert, CERT_NAME_RDN_TYPE, 0, PAnsiChar( '1.2.643.100.4'), CertName, 256) ; //Тут ошибка
 
  какая? код ошибки и её текст где?    | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
  Сказал(а) «Спасибо»: 17 раз
  
	 
	
     | 
    
        
            
		      
                Автор: Андрей *  Автор: Infopol  Автор: Андрей *  а что не получилось то? на какой строчке ошибка? 1.2.643.100.4 ИНН,  КПП в сертификате - нет (исключаем частный случай с текстовым атрибутом, в котором он может быть) Код:
   dwType := CERT_OID_NAME_STR;
   OID_NAME_STR := GetCertAnsiString(CERT_NAME_RDN_TYPE, 0, @dwType);
   INNLE := Get_OID(OID_NAME_STR, '1.2.643.100.4'); // Приказ ФСБ от 29.01.2021 - ИНН ЮЛ с 01.09.2021 в сертификатах
в GetCertAnsiString вызов CertGetNameStringA  для получения строки 
Get_OID - парсинг строки для поиска значения OID  
  Код:
SL := TStringList.Create;
   M := TMemoryStream.Create;
 if OpenDialog1.Execute then
 SL.LoadFromFile(OpenDialog1.FileName);
  Memo1.Clear;
  BPos := Pos('<'+Edit1.Text+'X509Certificate>', SL.Text) + Length('<'+Edit1.Text+'X509Certificate>');
 EPos := Pos('</'+Edit1.Text+'X509Certificate>', SL.Text);
 Value := ToBase64( Copy(SL.Text, BPos, EPos - BPos));
   SL.Clear;
  SL.Text:=( Value) ;
   SL.SaveToStream(M);
 Memo1.Lines.Add(Value);
 //CertCreateCertificateContext(        https://www.cyberforum.ru/delphi/thread302892.html
 {CertCreateCertificateContext(X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, M.Memory, M.Size);}
  pCert:= CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PByte(M.Memory),M.Size);
 
      dwType := CERT_OID_NAME_STR;
             CertGetNameString(pCert, CERT_NAME_RDN_TYPE, 0, PAnsiChar( '1.2.643.100.4'), CertName, 256) ; //Тут ошибка
 
  какая? код ошибки и её текст где?  Ошибка в crypt32.dll   dostat' sertifikat.zip  (922kb) загружен 10 раз(а). 
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Сотрудник
  Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,987   Сказал «Спасибо»: 605 раз Поблагодарили: 2350 раз в 1846 постах
  
	 
	
     | 
    
        
            
		      
                Тут до работы с криптографией нужно научиться работать со строками для начала. Видно же, что неправильные данные в memo1 после попытки найти base64 сертификата.    | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Сотрудник
  Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,987   Сказал «Спасибо»: 605 раз Поблагодарили: 2350 раз в 1846 постах
  
	 
	
     | 
    
         | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
  Сказал(а) «Спасибо»: 17 раз
  
	 
	
     | 
    
        
            
		      
                Автор: Андрей *  ToBase64 зачем?  У тебя работает?  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Сотрудник
  Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,987   Сказал «Спасибо»: 605 раз Поблагодарили: 2350 раз в 1846 постах
  
	 
	
     | 
    
        
            
		      
                Автор: Infopol  Автор: Андрей *  ToBase64 зачем?  У тебя работает?  странные вопросы ко мне .. подключай: в uses  в  var: Цитата:    base64Cert : string;   Base64Stream: TStringstream;
 
  Код:
  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; 
   Snimok ehkrana ot 2023-06-03 18-36-56.png  (5kb) загружен 10 раз(а).весь остальной мусор - выкидывай.    | 
 | 
            
	 
        
    
    
        
              2 пользователей поблагодарили Андрей * за этот пост.  
     | 
    
        
            Infopol оставлено 03.06.2023(UTC),  nickm оставлено 03.06.2023(UTC)
          
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
  Сказал(а) «Спасибо»: 17 раз
  
	 
	
     | 
    
        
            
		      
                Автор: Андрей *  Здравствуйте.
 
 
 
   Код:
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()
    dwSize := CertGetNameStringA(CertInfo, dwType, dwFlags, pvTypePara, nil, 0);
   // Win32Check(dwSize <> 0);
    SetLength(Result, dwSize);
    //Win32Check(
    CertGetNameStringA(CertInfo, dwType, dwFlags, pvTypePara, PAnsiChar(Result), dwSize);
//
CertGetNameString(pCert,  CERT_NAME_ATTR_TYPE, 0, PAnsiChar('1.2.643.3.131.1.1'),CertName ,256); //ИНН ФЛ лица на которого выдана подпись.
  end;
....
  dwType := CERT_X500_NAME_STR;
          SUBJECT := (GetInfo(pCert, CERT_NAME_RDN_TYPE, 0, @dwType));
         
 
    SUBJECT пустое почему то Отредактировано пользователем 3 июня 2023 г. 20:20:50(UTC)
 | Причина: Не указана  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Сотрудник
  Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,987   Сказал «Спасибо»: 605 раз Поблагодарили: 2350 раз в 1846 постах
  
	 
	
     | 
    
        
            
		      
                Автор: Infopol  Автор: Андрей *  Здравствуйте.
 
 
 
   Код:
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()
    dwSize := CertGetNameStringA(CertInfo, dwType, dwFlags, pvTypePara, nil, 0);
   // Win32Check(dwSize <> 0);
    SetLength(Result, dwSize);
    //Win32Check(
    CertGetNameStringA(CertInfo, dwType, dwFlags, pvTypePara, PAnsiChar(Result), dwSize);
//
CertGetNameString(pCert,  CERT_NAME_ATTR_TYPE, 0, PAnsiChar('1.2.643.3.131.1.1'),CertName ,256); //ИНН ФЛ лица на которого выдана подпись.
  end;
....
  dwType := CERT_X500_NAME_STR;
          SUBJECT := (GetInfo(pCert, CERT_NAME_RDN_TYPE, 0, @dwType));
         
 
    SUBJECT пустое почему то  все верно, программа делает то, что написано. кстати, зачем  dwflags := CRYPT_STRING_BASE64REQUESTHEADER внутри?  про dwType:=0 промолчу...  запросил CERT_X500_NAME_STR, а сам внутри обнулил... dwSize: Dword почему? если CertGetNameStringA cardinal возвращает. если подправить как написал, всё заработает:   Snimok ehkrana ot 2023-06-03 21-41-48.png  (7kb) загружен 13 раз(а).   | 
 | 
            
	 
        
    
    
        
              2 пользователей поблагодарили Андрей * за этот пост.  
     | 
    
        
            nickm оставлено 03.06.2023(UTC),  Infopol оставлено 04.06.2023(UTC)
          
     | 
    | 
        
	
     | 
        
        
        
    
	                           
	Форум КриптоПро
	 » 
	Средства криптографической защиты информации
	 » 
	Встраивание
	 » 
	Программно получить данные из эцп X509Certificate Base64Binary в Delphi 7
	 
	
    
        Быстрый переход
         
	
    
    Вы не можете создавать новые темы в этом форуме.
	
	Вы не можете отвечать в этом форуме.
	
	Вы не можете удалять Ваши сообщения в этом форуме.
	
	Вы не можете редактировать Ваши сообщения в этом форуме.
	
	Вы не можете создавать опросы в этом форуме.
	
	Вы не можете голосовать в этом форуме.
	
	
    
    
        Important Information:
        The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
        
        
More Details
        Close