2014-09-03 12 views
1

TLS 암호화를 서버 측 응용 프로그램에 추가하고 있습니다. Schannel API를 사용하여 TLS를 추가하고 있습니다. CertFindCertificateInStore에 문제가 있습니다. 그것은 내가 찾는 인증서를 찾지 못합니다. 검색 기준으로 나는 인증서의 이름을 사용하고 있습니다. 나는 지금 이것에 많은 시간을 보냈으며 그것이 왜 효과가 없는지 이해하지 못한다. 어떤 도움이라도 대단히 감사 할 것입니다. 이 기능을 사용하려면 아래에서 확인하십시오. 감사합니다,SCHANNEL TLS 서버 측에서 CertFindCertificateInStore를 사용할 수 없습니다.

INT의 ServerCreateCredentials() {

//- get the certificate store 
HCERTSTORE myCertStore = NULL; 
myCertStore = CertOpenStore(
          CERT_STORE_PROV_SYSTEM, 
          X509_ASN_ENCODING, 
          NULL, 
          CERT_SYSTEM_STORE_LOCAL_MACHINE, 
          L"My"); 

// check for the failure to find the appropriate store 
if (myCertStore == NULL) { 
    return 1; 
} 

// find the certificate in the store 
m_CertificateContext = CertFindCertificateInStore(
          myCertStore, 
          X509_ASN_ENCODING, 
          0, 
          CERT_FIND_SUBJECT_STR_A, 
          (LPVOID) CertificateName, 
          NULL); 

if (m_CertificateContext == NULL) { 
    // try unicode 
    m_CertificateContext = CertFindCertificateInStore(
          myCertStore, 
          X509_ASN_ENCODING, 
          0, 
          CERT_FIND_SUBJECT_STR_W, 
          CertificateName, 
          NULL); 

    if (m_CertificateContext == NULL) { 
     // free the store 
     CertCloseStore(myCertStore, CERT_CLOSE_STORE_CHECK_FLAG); 
     return 2; 
    } 
} 

TimeStamp life; 
// get the credentials 
SCHANNEL_CRED SchannelCredentials; 
ZeroMemory(&SchannelCredentials, sizeof(SchannelCredentials)); 

SchannelCredentials.dwVersion = SCHANNEL_CRED_VERSION; 

SchannelCredentials.cCreds = 1;       // number of credentials 
SchannelCredentials.paCred = &m_CertificateContext;  // credentials 
SchannelCredentials.hRootStore = myCertStore; // certificate store location 
SchannelCredentials.dwMinimumCipherStrength = 80;   // minimum encryption allowed 
SchannelCredentials.grbitEnabledProtocols = 0;   // let the dll decide 
SchannelCredentials.dwFlags = SCH_CRED_AUTO_CRED_VALIDATION 
           | SCH_CRED_NO_SERVERNAME_CHECK 
           | SCH_CRED_REVOCATION_CHECK_CHAIN; 
DWORD Status = SEC_E_OK; 
Status = m_securityFunctionTable.AcquireCredentialsHandle(
        NULL, 
        UNISP_NAME, 
        SECPKG_CRED_INBOUND, 
        NULL, 
        &SchannelCredentials, 
        NULL, 
        NULL, 
        &m_credentials, 
        &life); 

// at this point we should be good 
// free the store 
CertCloseStore(myCertStore, CERT_CLOSE_STORE_CHECK_FLAG); 
if (Status != SEC_E_OK) { 
    return 3; 
} 

return 0; 

답변

0

나는 올바른 매개 변수에서 검색되지 않았 음을 알아 낸. 주제 이름을 기준으로 검색해야합니다. 그러면 작동합니다.