Schannel용 인증서 가져오기
다음 예제에서는 인증서를 포함하는 CERT_CONTEXT 구조를 가져오는 단계를 보여 줍니다. 애플리케이션에 적합한 인증서 및 인증서 저장소를 선택해야 합니다.
이 예제에서는 인증서 저장소를 열고 SCHANNEL_CRED 구조를 통해 AcquireCredentialsHandle 함수에 전달될 인증서를 찾는 방법을 보여 줍니다.
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "crypt32.lib")
#define MACHINE_NAME "example server"
PCCERT_CONTEXT getServerCertificate ()
{
HCERTSTORE hMyCertStore = NULL;
PCCERT_CONTEXT aCertContext = NULL;
//-------------------------------------------------------
// Open the My store, also called the personal store.
// This call to CertOpenStore opens the Local_Machine My
// store as opposed to the Current_User's My store.
hMyCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,
X509_ASN_ENCODING,
0,
CERT_SYSTEM_STORE_LOCAL_MACHINE,
L"MY");
if (hMyCertStore == NULL)
{
printf("Error opening MY store for server.\n");
goto cleanup;
}
//-------------------------------------------------------
// Search for a certificate with some specified
// string in it. This example attempts to find
// a certificate with the string "example server" in
// its subject string. Substitute an appropriate string
// to find a certificate for a specific user.
aCertContext = CertFindCertificateInStore(hMyCertStore,
X509_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR_A,
MACHINE_NAME, // use appropriate subject name
NULL
);
if (aCertContext == NULL)
{
printf("Error retrieving server certificate.");
goto cleanup;
}
cleanup:
if(hMyCertStore)
{
CertCloseStore(hMyCertStore,0);
}
return aCertContext;
}