28.12.2004 14:42:53Создания запроса на сертификат Ответов: 1
Алексей
Здравствуйте,

Пытаюсь написать на сях программу, создания запроса на сертификат, для последующего использования этого запроса в АРМе администратора.
В структуру CERT_RDN_ATTR все параметры передаются с флагом CERT_RDN_PRINTABLE_STRING, в порядке начиная с EMail заканчивая SurName, т.е. как надо.
Файл запроса сохраняеться в Base64.
Дальше передаю этот файл в чисто виндовую службу сертификации, причем она его нормально обрабатывает, только если запрос не содержит кирилицу. Кирилицу виндовая служба преобразует во что то не потребное.
Запросы созданные таким же образом АРМ администратора воспринемает только, если в запросе содержиться только CN. Если в запросе указать что нибуть еще то АРМ выдает ошибку.
Не подскажите, как заставить АРМ воспринемать запросы (винда же воспринемает), и как сделать так, чтобы русские буквы также воспринемались.

Кусок кода формирующий структуру CERT_RDN_ATTR


rgNameAttr= new CERT_RDN_ATTR [szNameAttr];

int num=0;

if (strlen(Main_Form->UserNameListEditor->Values["Ýëåêòðîííàÿ ïî÷òà (EMail)"].c_str()))
{
rgNameAttr[num].pszObjId="1.2.840.113549.1.9.1";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
E = new char[1+strlen(Main_Form->UserNameListEditor->Values["Ýëåêòðîííàÿ ïî÷òà (EMail)"].c_str())];
strcpy(E,Main_Form->UserNameListEditor->Values["Ýëåêòðîííàÿ ïî÷òà (EMail)"].c_str());
rgNameAttr[num].Value.cbData=strlen(E);
rgNameAttr[num].Value.pbData=E;
num++;
}


if (strlen(Main_Form->UserNameListEditor->Values["Ñòðàíà/ðåãèîí (Country)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.6";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
Country = new char [1+strlen(Main_Form->UserNameListEditor->Values["Ñòðàíà/ðåãèîí (Country)"].c_str())];
strcpy(Country,Main_Form->UserNameListEditor->Values["Ñòðàíà/ðåãèîí (Country)"].c_str());
MessageBox(NULL,Country,IntToStr(strlen(Country)).c_str(),NULL);
rgNameAttr[num].Value.cbData=strlen(Country);
rgNameAttr[num].Value.pbData=Country;
num++;


}

if (strlen(Main_Form->UserNameListEditor->Values["Îáëàñòü (State)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.8";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
State=new char [1+strlen(Main_Form->UserNameListEditor->Values["Îáëàñòü (State)"].c_str())];
strcpy(State,Main_Form->UserNameListEditor->Values["Îáëàñòü (State)"].c_str());
rgNameAttr[num].Value.cbData=strlen(State);
rgNameAttr[num].Value.pbData=State;
num++;
}


if (strlen(Main_Form->UserNameListEditor->Values["Ãîðîä (Locality)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.7";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
L=new char[1+strlen(Main_Form->UserNameListEditor->Values["Ãîðîä (Locality)"].c_str())];
strcpy(L,Main_Form->UserNameListEditor->Values["Ãîðîä (Locality)"].c_str());
rgNameAttr[num].Value.cbData=strlen(L);
rgNameAttr[num].Value.pbData=L;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Îðãàíèçàöèÿ (Organization)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.10";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
O=new char[1+strlen(Main_Form->UserNameListEditor->Values["Îðãàíèçàöèÿ (Organization)"].c_str())];
strcpy(O,Main_Form->UserNameListEditor->Values["Îðãàíèçàöèÿ (Organization)"].c_str());
rgNameAttr[num].Value.cbData=strlen(O);
rgNameAttr[num].Value.pbData=O;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Ïîäðàçäåëåíèå (OrganizationalUnit)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.11";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
OU=new char[1+strlen(Main_Form->UserNameListEditor->Values["Ïîäðàçäåëåíèå (OrganizationalUnit)"].c_str())];
strcpy(OU,Main_Form->UserNameListEditor->Values["Ïîäðàçäåëåíèå (OrganizationalUnit)"].c_str());
rgNameAttr[num].Value.cbData=strlen(OU);
rgNameAttr[num].Value.pbData=OU;
num++;
}

//--Common -- Name----

rgNameAttr[num].pszObjId="2.5.4.3";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
CN= new char[1+strlen(Main_Form->UserNameListEditor->Values["Îáùåå èìÿ (CommonName)"].c_str())];

strcpy(CN,Main_Form->UserNameListEditor->Values["Îáùåå èìÿ (CommonName)"].c_str());

rgNameAttr[num].Value.cbData=strlen(CN);
rgNameAttr[num].Value.pbData=CN;
num++;
//-----------------------





if (strlen(Main_Form->UserNameListEditor->Values["Êîìïàíåíòà äîìåííîãî èìåíè (DomainComponent)"].c_str()))
{
rgNameAttr[num].pszObjId="0.9.2342.19200300.100.1.25";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
DC= new char[1+strlen(Main_Form->UserNameListEditor->Values["Êîìïàíåíòà äîìåííîãî èìåíè (DomainComponent)"].c_str())];
strcpy(DC,Main_Form->UserNameListEditor->Values["Êîìïàíåíòà äîìåííîãî èìåíè (DomainComponent)"].c_str());
rgNameAttr[num].Value.cbData=strlen(DC);
rgNameAttr[num].Value.pbData=DC;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Ñåðèéíûé íîìåð óñòðîéñòâà (DeviceSerialNumber)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.5";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
DSN = new char[1+strlen(Main_Form->UserNameListEditor->Values["Ñåðèéíûé íîìåð óñòðîéñòâà (DeviceSerialNumber)"].c_str())];
strcpy(DSN,Main_Form->UserNameListEditor->Values["Ñåðèéíûé íîìåð óñòðîéñòâà (DeviceSerialNumber)"].c_str());
rgNameAttr[num].Value.cbData=strlen(DSN);
rgNameAttr[num].Value.pbData=DSN;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Íåñòðóêòóðèðîâàííûé àäðåñ (UnstructedAddres)"].c_str()))
{
rgNameAttr[num].pszObjId="1.2.840.113549.1.9.8";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
UA= new char [1+strlen(Main_Form->UserNameListEditor->Values["Íåñòðóêòóðèðîâàííûé àäðåñ (UnstructedAddres)"].c_str())];
strcpy(UA,Main_Form->UserNameListEditor->Values["Íåñòðóêòóðèðîâàííûé àäðåñ (UnstructedAddres)"].c_str());
rgNameAttr[num].Value.cbData=strlen(UA);
rgNameAttr[num].Value.pbData=UA;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Àäðåñ (StreetAddres)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.9";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
SA= new char[1+strlen(Main_Form->UserNameListEditor->Values["Àäðåñ (StreetAddres)"].c_str())];
strcpy(SA,Main_Form->UserNameListEditor->Values["Àäðåñ (StreetAddres)"].c_str());
rgNameAttr[num].Value.cbData=strlen(SA);
rgNameAttr[num].Value.pbData=SA;
num++;
}


if (strlen(Main_Form->UserNameListEditor->Values["Íåñòðóêòóðèðîâàííîå èìÿ (UnstructedName)"].c_str()))
{
rgNameAttr[num].pszObjId="1.2.840.113549.1.9.2";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
UN=new char [1+strlen(Main_Form->UserNameListEditor->Values["Íåñòðóêòóðèðîâàííîå èìÿ (UnstructedName)"].c_str())];
strcpy(UN,Main_Form->UserNameListEditor->Values["Íåñòðóêòóðèðîâàííîå èìÿ (UnstructedName)"].c_str());
rgNameAttr[num].Value.cbData=strlen(UN);
rgNameAttr[num].Value.pbData=UN;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Äîëæíîñòü/çâàíèå (Title)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.12";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
T=new char[1+strlen(Main_Form->UserNameListEditor->Values["Äîëæíîñòü/çâàíèå (Title)"].c_str())];
strcpy(T,Main_Form->UserNameListEditor->Values["Äîëæíîñòü/çâàíèå (Title)"].c_str());
rgNameAttr[num].Value.cbData=strlen(T);
rgNameAttr[num].Value.pbData=T;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Èíèöèàëû (Initials)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.43";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
I= new char[1+strlen(Main_Form->UserNameListEditor->Values["Èíèöèàëû (Initials)"].c_str())];
strcpy(I,Main_Form->UserNameListEditor->Values["Èíèöèàëû (Initials)"].c_str());
rgNameAttr[num].Value.cbData=strlen(I);
rgNameAttr[num].Value.pbData=I;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Èìÿ (GivenName)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.42";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
GN= new char[1+strlen(Main_Form->UserNameListEditor->Values["Èìÿ (GivenName)"].c_str())];
strcpy(GN,Main_Form->UserNameListEditor->Values["Èìÿ (GivenName)"].c_str());
rgNameAttr[num].Value.cbData=strlen(GN);
rgNameAttr[num].Value.pbData=GN;
num++;
}

if (strlen(Main_Form->UserNameListEditor->Values["Ôàìèëèÿ (SurName)"].c_str()))
{
rgNameAttr[num].pszObjId="2.5.4.4";
rgNameAttr[num].dwValueType=CERT_RDN_PRINTABLE_STRING;
SN = new char [1+strlen(Main_Form->UserNameListEditor->Values["Ôàìèëèÿ (SurName)"].c_str())];
strcpy(SN,Main_Form->UserNameListEditor->Values["Ôàìèëèÿ (SurName)"].c_str());
rgNameAttr[num].Value.cbData=strlen(SN);
rgNameAttr[num].Value.pbData=SN;
num++;
}


Заранее спасибо.

 
Ответы:
29.12.2004 10:52:03Kirill Sobolev
А на сам получившийся запрос можно глянуть?