파일에서 인증서 로드
이 항목에서는 인증서 파일에서 인증서를 로드하는 방법에 대해 설명합니다.
인증서 파일에서 인증서를 로드하려면
- 읽기 액세스를 위해 인증서 파일을 엽니다.
- 인증서 파일의 내용을 인증서 버퍼로 읽습니다.
- 버퍼의 내용을 사용하여 인증서를 만듭니다.
// In the interest of simplicity, this example
// uses a fixed-length buffer to hold the certificate.
// A more robust solution would be to query the size
// of the certificate file and dynamically
// allocate a buffer of that size or greater.
#define CERTIFICATE_BUFFER_SIZE 1024
HRESULT hr = S_OK;
BYTE certEncoded[CERTIFICATE_BUFFER_SIZE] = {0};
DWORD certEncodedSize = 0L;
HANDLE certFileHandle = NULL;
BOOL result = FALSE;
// open the certificate file
certFileHandle = CreateFile(certFile,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == certFileHandle) {
hr = HRESULT_FROM_WIN32(GetLastError());
}
if (SUCCEEDED(hr)) {
// if the buffer is large enough
// read the certificate file into the buffer
if (GetFileSize (certFileHandle, NULL) <= CERTIFICATE_BUFFER_SIZE) {
result = ReadFile(certFileHandle,
certEncoded,
CERTIFICATE_BUFFER_SIZE,
&certEncodedSize,
NULL);
if (!result) {
// the read failed, return the error as an HRESULT
hr = HRESULT_FROM_WIN32(GetLastError());
} else {
hr = S_OK;
}
} else {
// The certificate file is larger than the allocated buffer.
// To handle this error, you could dynamically allocate
// the certificate buffer based on the file size returned or
// use a larger static buffer.
hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA);
}
}
if (SUCCEEDED(hr))
{
// create a certificate from the contents of the buffer
*cert = CertCreateCertificateContext(X509_ASN_ENCODING,
certEncoded,
certEncodedSize);
if (!(*cert)) {
hr = HRESULT_FROM_WIN32(GetLastError());
CloseHandle(certFileHandle);
hr = E_FAIL;
} else {
hr = S_OK;
}
}
// close the certificate file
if (NULL != certFileHandle) CloseHandle(certFileHandle);
관련 항목
-
다음 단계
-
이 예제에서 사용됨
-
상세 설명