Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Программно получить данные из эцп X509Certificate Base64Binary в Delphi 7
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,357 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
а что не получилось то? на какой строчке ошибка? 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,357 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
Автор: 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) загружен 9 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,357 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
Тут до работы с криптографией нужно научиться работать со строками для начала. Видно же, что неправильные данные в memo1 после попытки найти base64 сертификата. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,357 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
Сказал(а) «Спасибо»: 17 раз
|
Автор: Андрей * ToBase64 зачем? У тебя работает?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,357 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
Автор: 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) загружен 9 раз(а).весь остальной мусор - выкидывай. |
|
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,357 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
Автор: 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) загружен 12 раз(а). |
|
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