2013-03-25 17 views
5

Un'applicazione client deve accedere al certificato dall'archivio certificati di Windows. L'input di ricerca è il nome del soggetto nel formato di stringa X500 come indicato di seguito.Hai bisogno di aiuto per trovare il certificato in base al nome del soggetto (formato X500, CERT_X500_NAME_STR) utilizzando CertFindCertificateInStore()?

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

è necessaria una corrispondenza esatta (non substring partita usando CERT_FIND_SUBJECT_STR). Per questo faccio la seguente

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; 
     } 
    } 
    } 

Il problema è che CertFindCertificateInStore restituisce sempre puntatore NULL. Ho eseguito il debug, ma non sono riuscito a scoprire cosa sta andando storto qui.

Qualsiasi suggerimento sarà molto utile.

+0

quello negozio cercate il certificato? vale a dire hStore UTENTE o MACCHINA? – Raj

+0

Sto cercando nel negozio USER. – Sreekanth

risposta

5

Nel caso qualcuno è alla ricerca di una risposta a questa domanda, mi distacco come potrei farlo, in caso è utile

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; 
}