2011-10-15 2 views
1

현재 프로젝트에서 스마트 카드의 모든 인증서를 내 프로그램에로드해야하므로 PCCERT_CONTEXT에서 공급자 이름을 가져 오려고했습니다. 그리고 미래에는 갱신 인증서, 삭제 인증서 같은 일부 작업으로 해당 인증서를 처리해야합니다. 하지만 문제가 있습니다. CSP 이름과 공급자 이름을 CryptAcquireContext로 매핑해야합니다. 그리고 나는 현재 이것을 보관하는 방법을 혼란 스럽습니다. 누군가이 문제를 해결할 수있는 지침을 가지고있을 수 있습니까? dwPropId가 CERT_KEY_PROV_INFO_PROP_ID 인 CertGetCertificateContextProperty를 시도했지만 CRYPT_KEY_PROV_INFO를 얻을 수 없습니다.PCCERT_CONTEXT에서 CSP의 공급자 이름을 얻는 방법은 무엇입니까?

답변

1

올바르게 이해했다면 다음 스 니펫은 인증서에서 키 제공 업체 정보를 추출하는 방법을 보여줍니다.

void trace(char* message, DWORD errorCode) 
{ 
    cout << message << errorCode; 
} 

std::wstring Test_CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext) 
{ 
    DWORD dwSize = 0;  
    BOOL bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                 CERT_KEY_PROV_INFO_PROP_ID, 
                 NULL, 
                 &dwSize); 
    if (!bIsSuccess) 
    { 
     trace("CertGetCertificateContextProperty failed with error: ", GetLastError()); 
     return L""; 
    } 

    PCRYPT_KEY_PROV_INFO pKeyProvInfo = (PCRYPT_KEY_PROV_INFO)LocalAlloc(LMEM_ZEROINIT, dwSize); 
    if (pKeyProvInfo == NULL) 
    { 
     trace("LocalAlloc failed with error:", GetLastError()); 
     return L""; 
    } 

    bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                CERT_KEY_PROV_INFO_PROP_ID, 
                pKeyProvInfo, 
                &dwSize); 

    std::wstring provName; 
    if (bIsSuccess) 
    { 
     provName = pKeyProvInfo->pwszProvName; 
    } 

    LocalFree(pKeyProvInfo); 

    return provName; 
} 
관련 문제