2013-03-25 188 views
5

客戶端應用程序必須從Windows證書存儲區訪問證書。搜索 輸入是X500字符串格式的主題名稱,如下所示。需要幫助以使用CertFindCertificateInStore()按主題名稱(X500格式,CERT_X500_NAME_STR)查找證書?

"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 2013-03-26 14:09:36

+0

我在USER商店中搜索。 – Sreekanth 2013-03-29 06:15:23

回答

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