인증서 해지 목록 검색
CA( 인증 기관 )는 CRL( 인증서 해지 목록 )을 게시할 책임이 있습니다. ICertAdmin2::GetCRL 메서드를 사용하여 현재 CRL을 검색할 수 있습니다. CA의 인증서가 갱신된 경우 이전 CA 인증서에 대한 CRL을 검색해야 할 수 있습니다. CA 갱신에 대한 자세한 내용은 인증 기관 갱신을 참조하세요. 또한 CA는 델타 CRL을 게시할 수 있습니다. 갱신된 CA 인증서 또는 델타 CRL에 대한 CRL을 검색하려면 ICertAdmin2::GetCAProperty 또는 ICertRequest2::GetCAProperty 메서드를 사용합니다.
다음 예제에서는 현재 CRL을 검색하는 방법을 보여줍니다.
ICertAdmin2 * pCertAdmin2 = NULL; // pointer to interface object
BSTR bstrCA = NULL; // variable for computer\CAname
BSTR bstrCRL = NULL; // variable to contain the retrieved CRL
HRESULT hr;
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (FAILED(hr))
{
printf("Failed CoInitializeEx [%x]\n", hr);
goto error;
}
// Create the CertAdmin object,
// and get a pointer to its ICertAdmin interface.
hr = CoCreateInstance( CLSID_CCertAdmin,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICertAdmin2,
(void **)&pCertAdmin2);
if (FAILED(hr))
{
printf("Failed CoCreateInstance pCertAdmin2 [%x]\n", hr);
goto error;
}
// Note the use of two '\' in C++ to produce one '\'.
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (bstrCA == NULL)
{
printf("Failed to allocate memory for bstrCA\n");
goto error;
}
// Retrieve the CRL.
hr = pCertAdmin2->GetCRL( bstrCA, CR_OUT_BINARY, &bstrCRL );
if (FAILED(hr))
{
printf("Failed GetCRL [%x]\n", hr);
goto error;
}
else
printf("CRL retrieved successfully\n");
// Use the CRL as needed...
// Processing is finished.
error:
// Free BSTR values.
if (NULL != bstrCA)
SysFreeString(bstrCA);
if (NULL != bstrCRL)
SysFreeString(bstrCRL);
// Clean up object resources.
if (NULL != pCertAdmin2)
pCertAdmin2->Release();
// Free COM resources.
CoUninitialize();
다음 예제에서는 갱신된 CA 인증서에 대한 CRL을 포함하여 기본 및 델타 CRL을 검색하는 방법을 보여 줍니다. 이 예제에서는 ICertAdmin2::GetCAProperty를 사용하지만 ICertRequest2::GetCAProperty 는 유사한 기능을 제공합니다.
LONG nCACertCount, nIndex, nCRLState;
VARIANT variant;
VariantInit(&variant);
// Determine the number of CA certificates.
hr = pCertAdmin2->GetCAProperty(bstrCA,
CR_PROP_CASIGCERTCOUNT,
0,
PROPTYPE_LONG,
CR_OUT_BINARY,
&variant);
if (FAILED(hr))
{
printf("Failed call to GetCAProperty - "
"CR_PROP_CASIGCERTCOUNT\n");
goto error;
}
nCACertCount = variant.lVal;
VariantClear(&variant);
for (nIndex = 0; nIndex < nCACertCount; nIndex++)
{
// Determine the CRL state for each certificate index.
hr = pCertAdmin2->GetCAProperty(bstrCA,
CR_PROP_CRLSTATE,
nIndex,
PROPTYPE_LONG,
CR_OUT_BINARY,
&variant);
if (FAILED(hr))
{
printf("Failed call to GetCAProperty - "
"CR_PROP_CRLSTATE\n");
goto error;
}
nCRLState = variant.lVal;
VariantClear(&variant);
// Process certificate indices only when
// the CRL state is valid.
if (CA_DISP_VALID == nCRLState)
{
// Retrieve the base CRL.
hr = pCertAdmin2->GetCAProperty(bstrCA,
CR_PROP_BASECRL,
nIndex,
PROPTYPE_BINARY,
CR_OUT_BINARY,
&variant);
if (FAILED(hr))
{
printf("Failed call to GetCAProperty - "
"CR_PROP_BASECRL\n");
goto error;
}
// Use the base CRL as needed (not shown).
// ...
VariantClear(&variant);
// Retrieve the delta CRL.
hr = pCertAdmin2->GetCAProperty(bstrCA,
CR_PROP_DELTACRL,
nIndex,
PROPTYPE_BINARY,
CR_OUT_BINARY,
&variant);
if (FAILED(hr))
{
printf("Failed call to GetCAProperty - "
"CR_PROP_DELTACRL\n");
goto error;
}
// Use the delta CRL as needed (not shown).
// ...
VariantClear(&variant);
}
}
// Processing is finished.
error:
// Clean up object resources.
if ( NULL != pCertAdmin2 )
pCertAdmin2->Release();
// Free BSTR variables.
if ( NULL != bstrCA )
SysFreeString ( bstrCA );
// Clear the variant.
VariantClear(&variant);
```