Caricare un certificato da un file
In questo argomento viene descritto come caricare un certificato da un file di certificato.
Per caricare un certificato da un file di certificato
- Aprire il file del certificato per l'accesso in lettura.
- Leggere il contenuto del file di certificato nel buffer dei certificati.
- Creare un certificato usando il contenuto del buffer.
// 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);
Argomenti correlati
-
Passaggi successivi
-
Usato in questo esempio
-
Ulteriori informazioni