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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline AlexEr81  
#1 Оставлено : 8 октября 2015 г. 11:58:32(UTC)
AlexEr81

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

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

Offline AlexEr81  
#2 Оставлено : 9 октября 2015 г. 16:18:03(UTC)
AlexEr81

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

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

Offline AlexEr81  
#3 Оставлено : 13 октября 2015 г. 10:51:50(UTC)
AlexEr81

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

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

и потом задать длину
Код:
setlength(nameAttr,3);

то CryptEncodeObject выдает ошибку: неправильное значение ASN1
почему?
в обоих случаях значение nameAttr одинаковое. а у rdn получается разное.

Отредактировано пользователем 13 октября 2015 г. 11:06:35(UTC)  | Причина: Не указана

Offline Boris@Serezhkin.com  
#4 Оставлено : 13 октября 2015 г. 12:49:14(UTC)
Boris@Serezhkin.com

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

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

А как в памяти лежит? Передай адрес первого элемента.
Offline AlexEr81  
#5 Оставлено : 13 октября 2015 г. 13:28:35(UTC)
AlexEr81

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

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

Offline AlexEr81  
#6 Оставлено : 13 октября 2015 г. 16:05:11(UTC)
AlexEr81

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

Группы: Участники
Зарегистрирован: 09.11.2012(UTC)
Сообщений: 65
Откуда: Ростовская область

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
почитал про массивы, тему "Взаимосвязи между указателями и массивами"
получается что:
rdn.rgRDNAttr:= @nameAttr; эквивалентно rdn.rgRDNAttr:= @nameAttr[0];
оказалось rdn.rgRDNAttr:= @nameAttr[0] срабатывает правильно и для статического массива и для динамического.
проблема вроде решена.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.