2013-03-25 7 views
5

क्लाइंट एप्लिकेशन को विंडोज प्रमाणपत्र स्टोर से प्रमाणपत्र एक्सेस करना होगा। खोज इनपुट नीचे वर्णित 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 हमेशा शून्य सूचक वापसी है। मैं डिबगिंग कर रहा हूं, लेकिन यह पता नहीं लगा कि यहां क्या गलत हो रहा है।

कोई भी सुझाव बहुत उपयोगी होगा।

+0

क्या दुकान आप अपना प्रमाणपत्र खोज रहे हैं? यानी एचस्टोर यूजर या मशीन? – 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; 
} 
संबंधित मुद्दे