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

Уведомление

Icon
Error

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

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
а что не получилось то? на какой строчке ошибка?


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 
Техническую поддержку оказываем тут
Наша база знаний
Offline Infopol  
#22 Оставлено : 3 июня 2023 г. 16:39:37(UTC)
Infopol

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

Группы: Участники
Зарегистрирован: 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) ; //Тут ошибка

Offline Андрей *  
#23 Оставлено : 3 июня 2023 г. 16:53:56(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: 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) ; //Тут ошибка




какая? код ошибки и её текст где?

Техническую поддержку оказываем тут
Наша база знаний
Offline Infopol  
#24 Оставлено : 3 июня 2023 г. 17:12:41(UTC)
Infopol

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

Группы: Участники
Зарегистрирован: 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) загружен 8 раз(а).
Offline Андрей *  
#25 Оставлено : 3 июня 2023 г. 17:26:13(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Тут до работы с криптографией нужно научиться работать со строками для начала.
Видно же, что неправильные данные в memo1 после попытки найти base64 сертификата.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#26 Оставлено : 3 июня 2023 г. 17:28:46(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
ToBase64 зачем?
Техническую поддержку оказываем тут
Наша база знаний
Offline Infopol  
#27 Оставлено : 3 июня 2023 г. 17:38:40(UTC)
Infopol

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

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

Сказал(а) «Спасибо»: 17 раз
Автор: Андрей * Перейти к цитате
ToBase64 зачем?


У тебя работает?
Offline Андрей *  
#28 Оставлено : 3 июня 2023 г. 17:47:06(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: Infopol Перейти к цитате
Автор: Андрей * Перейти к цитате
ToBase64 зачем?


У тебя работает?


странные вопросы ко мне ..

подключай:
в uses
Цитата:
EncdDecd


в 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) загружен 9 раз(а).


весь остальной мусор - выкидывай.


Техническую поддержку оказываем тут
Наша база знаний
thanks 2 пользователей поблагодарили Андрей * за этот пост.
Infopol оставлено 03.06.2023(UTC), nickm оставлено 03.06.2023(UTC)
Offline Infopol  
#29 Оставлено : 3 июня 2023 г. 20:19:30(UTC)
Infopol

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Андрей *  
#30 Оставлено : 3 июня 2023 г. 20:50:42(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: 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) загружен 10 раз(а).

Техническую поддержку оказываем тут
Наша база знаний
thanks 2 пользователей поблагодарили Андрей * за этот пост.
nickm оставлено 03.06.2023(UTC), Infopol оставлено 04.06.2023(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
4 Страницы<1234>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.