10.08.2007 2:19:36Не находится сертификат Ответов: 3
sql
Почему этот код не находит сертификат с русскими буквами и пробелами в имени?

//создадим атрибут, по которому будем искать
CERT_RDN_ATTR certRDNAttr[1];
certRDNAttr[0].pszObjId = szOID_COMMON_NAME;
certRDNAttr[0].dwValueType = CERT_RDN_UNICODE_STRING;

szWCommonName = L"Иван Петров";
certRDNAttr[0].Value.pbData = (PBYTE) szWCommonName;
certRDNAttr[0].Value.cbData = wcslen(szWCommonName)*sizeof(WCHAR)+1;

pContext = CertFindCertificateInStore( hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CERT_UNICODE_IS_RDN_ATTRS_FLAG, CERT_FIND_SUBJECT_ATTR,
&certRDN,NULL);


//а этот код работает прекрасно:
pContext = CertFindCertificateInStore( hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,0,
CERT_FIND_SUBJECT_STR, szWCommonName, NULL);

Перепробовал кучу вариантов, просидел всю ночь, но так и не смог заставить работать первый вариант. В чем загвоздка?

CN получено так :
CertGetNameString(pContext,
CERT_NAME_ATTR_TYPE,//ищем атрибут
0,
szOID_COMMON_NAME,//атрибут
szCommonName, //буфер
1024);//размер буфера
 
Ответы:
10.08.2007 10:09:16Kirill Sobolev
А в сертификате CN точно юникодный?
10.08.2007 18:38:43sql
похоже, что не юникодный. Но как тогда быть, ведь там русские буквы?
13.08.2007 10:24:37Kirill Sobolev
Нужно указывать при поиске ту кодировку, которая использована в сертификате.