| ||||
| ||||
Почему этот код не находит сертификат с русскими буквами и пробелами в имени? //создадим атрибут, по которому будем искать 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);//размер буфера | ||||
Ответы: | ||||
| ||||
А в сертификате CN точно юникодный? | ||||
| ||||
похоже, что не юникодный. Но как тогда быть, ведь там русские буквы? | ||||
| ||||
Нужно указывать при поиске ту кодировку, которая использована в сертификате. | ||||