2013-03-25 2 views
5

Клиентское приложение должно получить доступ к сертификату из хранилища сертификатов Windows. Поиск input - это название темы в формате строки X500, как показано ниже.Нужна помощь в поиске сертификата по имени субъекта (формат X500, CERT_X500_NAME_STR) с использованием CertFindCertificateInStore()?

"C=CH, S=Aargau, L=Baden, O=Test, OU=FF, CN= Test Root" 

требуется точное совпадение (не подстроки матч, используя CERT_FIND_SUBJECT_STR). Для этого я сделать следующий

CERT_NAME_BLOB subjectname = {0}; 

/*convert the input X500 string to encoded subject name*/ 
bRet = CertStrToNameA(X509_ASN_ENCODING, "C=CH, S=Aargau, L=Baden, O=Test, OU=S1, CN= Test Root", CERT_X500_NAME_STR, NULL, NULL, &size, NULL); 
    if(TRUE == bRet) 
    { 
    subjectname.pbData = (BYTE*)malloc(size); 
    subjectname.cbData = size; 

    bRet = CertStrToNameA(X509_ASN_ENCODING , "C=CH, S=Aargau, L=Baden, O=Test, OU=S1, CN=Test Root", CERT_X500_NAME_STR, NULL, subjectname.pbData, &subjectname.cbData, NULL); 
    if(TRUE == bRet) 
    { 
      capiCertificate = CertFindCertificateInStore(hStore, X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &subjectname, NULL); 
     if (NULL == capiCertificate) 
     { 
      errorcode = GetLastError(); 
      ret = CA_CERT_NOT_FOUND; 
     } 
    } 
    } 

Проблема заключается в том, что CertFindCertificateInStore всегда возвращает NULL указателя. Я отлаживал, но не мог узнать, что здесь происходит.

Любые предложения будут очень полезными.

+0

, что магазин вы ищете сертификат? т.е. hStore USER или MACHINE? – Raj

+0

Я ищу в магазине USER. – Sreekanth

ответ

5

В случае, если кто-то ищет ответ на этот вопрос, я вывешиваю, как я мог это сделать, упаковывают полезно

static PCCERT_CONTEXT 
FindCertificate(
    const HCERTSTORE hStore, 
    const char* CertSearchString) 
{ 
    PCCERT_CONTEXT capiCertificate = NULL; 
    DWORD dType = CERT_X500_NAME_STR | CERT_NAME_STR_REVERSE_FLAG; 
    char certname [MAX_SIZE_CERT_NAME] = {0}; 

    for(;;) 
    { 
     capiCertificate = CertEnumCertificatesInStore(hStore, capiCertificate); 
     if (NULL == capiCertificate) 
     { 
      break; 
     } 

     if (FALSE == 
      CertGetNameStringA(capiCertificate, CERT_NAME_RDN_TYPE, 
       0, &dType, certname, MAX_SIZE_CERT_NAME)) 
     { 
      CertFreeCertificateContext(capiCertificate); 
      capiCertificate = NULL; 
      break; 
     } 

     if ((0 == strncmp(certname, CertSearchString, MAX_SIZE_CERT_NAME)) && 
      (capiCertificate->dwCertEncodingType == X509_ASN_ENCODING)) 
     { 
      break; 
     } 
    } 
    return capiCertificate; 
}