Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
Пытаюсь сделать запрос на сертификат. Если я получаю CERT_REQUEST_INFO.Subject c помощью: Ручного заполнения атрибутов - CERT_NAME_INFO. CERT_RDN_ATTR, а потом кодирования Код:CryptEncodeObject (X509_ASN_ENCODING, X509_NAME, CERT_NAME_INFO, CERT_REQUEST_INFO.Subject. pbData, CERT_REQUEST_INFO.Subject. cbData)
то потом сохраненный запрос нормально читается ,но проблема с кириллицей в значениях. они после кодирования не читаются вместо значения «????????». На форуме пишут что надо пользоваться CertStrToName. Пробую её. Код:CertStrToName(X509_ASN_ENCODING,Pchar('2.5.4.3='+e_FIO.text+', 2.5.4.8='+e_region.text),CERT_OID_NAME_STR,nil,encName, @encNameLen,ppszError)
Что возвращается в encName и encNameLen? Готовый CERT_REQUEST_INFO.Subject? Делаю CERT_REQUEST_INFO.Subject.cbData:= encNameLen; CERT_REQUEST_INFO.Subject.pbData:=@encName; И прочее… Сохраняю запрос. он не читается. Полученный CERT_REQUEST_INFO.Subject не декодируется в в cert_name_info с помощью CryptDecodeObject (X509_ASN_ENCODING, X509_NAME,...).и не конвертируется в строку с помощью CertNameToStr Код:CertNameToStr(X509_ASN_ENCODING, @CERT_REQUEST_INFO.Subject,CERT_OID_NAME_STR,strname,size)
обе функции отвечают "встречено неверное значение тега ASN1. Причем проверяю сразу после CertStrToName. Что не так делаю? Отредактировано пользователем 9 октября 2015 г. 10:20:41(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
CertStrToName не поборол. нашел на старом форуме как конвертировать в юникод строку в итоге на паскале выглядит так: Код:
function StringToUnicode(s:string;var sz:integer):PWideChar;
var cbWideString : integer;
pWideString : PWideChar;
begin
cbWideString := Length(s) * 3;
pWideString := PWideChar(AllocMem(cbWideString));
pUtfString := PChar(AllocMem(cbWideString));
MultiByteToWideChar(CP_ACP, 0, PAnsiChar(s), Length(s), pWideString, cbWideString);
sz:= cbWideString;
Result:=pWideString;
end;
var
CN:string;
...
CN:='Иванов Иван Иванович';
ss:=StringToUnicode(CN,sz);
nameAttr.dwValueType:=CERT_RDN_UNICODE_STRING;
nameAttr.Value.cbData:=sz;
nameAttr.Value.pbData:= PBYTE(ss);
nameAttr.pszObjId:= szOID_COMMON_NAME;
а потом с помощью CryptEncodeObject все нормально кодируется и потом открывается. вопрос снят. Отредактировано пользователем 15 января 2016 г. 16:40:48(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
вот такой код отлично работает если nameAttr статический массив Код:var nameAttr: array [0..2] of CERT_RDN_ATTR;
nameAttr[0]:=new_attr(e_FIO.text,szOID_COMMON_NAME);
nameAttr[1]:=new_attr(Org.text,szOID_ORGANIZATION_NAME);
nameAttr[2]:=new_attr(e_dolgn.Text,szOID_TITLE );
rdn.cRDNAttr:= 3;
rdn.rgRDNAttr:= @nameAttr;
nameInf.cRDN:= 1;
nameInf.rgRDN:= @rdn;
if not CryptEncodeObject (encType, X509_NAME, @nameInf, nil, @encNameLen)then
MessageDlg(SysErrorMessage(Getlasterror), mtError, [mbOK], 0);
GetMem (encName, encNameLen);
if not CryptEncodeObject (X509_ASN_ENCODING, X509_NAME, @nameInf, encName,@encNameLen)
then MessageDlg(SysErrorMessage(Getlasterror), mtError, [mbOK], 0);
а если его сделать динамическим Код:var nameAttr: array of CERT_RDN_ATTR;
и потом задать длину то CryptEncodeObject выдает ошибку: неправильное значение ASN1 почему? в обоих случаях значение nameAttr одинаковое. а у rdn получается разное. Отредактировано пользователем 13 октября 2015 г. 11:06:35(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.08.2010(UTC) Сообщений: 259 Откуда: Moscow
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 11 раз в 10 постах
|
Автор: AlexEr81  вот такой код отлично работает если nameAttr статический массив Код:var nameAttr: array [0..2] of CERT_RDN_ATTR;
а если его сделать динамическим Код:var nameAttr: array of CERT_RDN_ATTR;
то CryptEncodeObject выдает ошибку: неправильное значение ASN1 почему? в обоих случаях значение nameAttr одинаковое. а у rdn получается разное. А как в памяти лежит? Передай адрес первого элемента.
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
Это? nameattr[0]=(pszObjId:'2.5.4.3'; dwValueType:12; Value:(cbData:60;pbData$154D34)) Когда массив статический то получается rdn.rgRDNAttr.pszObjId='2.5.4.3' rdn.rgRDNAttr.value=(cbData:60;pbData$154D34) а когда динамический, там rdn.rgRDNAttr.pszObjId = мусор rdn.rgRDNAttr.value=(cbData:4497442;pbData$9D0C40) Отредактировано пользователем 13 октября 2015 г. 13:56:27(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
почитал про массивы, тему "Взаимосвязи между указателями и массивами" получается что: rdn.rgRDNAttr:= @nameAttr; эквивалентно rdn.rgRDNAttr:= @nameAttr[0]; оказалось rdn.rgRDNAttr:= @nameAttr[0] срабатывает правильно и для статического массива и для динамического. проблема вроде решена.
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close