3.6 電子証明書の有効性の確認
電子証明書は、利用するときにその有効性を確認しなければなりません。
3.6.1 電子証明書の準備
まず、電子証明書を準備します。WindowsXP用の関数を使用していますので、Cryptui.libをリンクしてください。
WindowsXP以前でGUIを利用する場合は、Windows98で利用可能なダイアログ を参照してください。
WindowsXP以前でGUIを利用する場合は、Windows98で利用可能なダイアログ を参照してください。
#include <WinCrypt.h>
#include <CryptuiAPI.h>
HCRYPTPROV hProv;
HCERTSTORE hStore;
// CSPハンドルの取得
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, NULL))
{
if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_NEWKEYSET))
{
fprintf(stderr, "CryptAcquireContext error\n");
return 1;
}
}
// 証明書ストアーのオープン
hStore = CertOpenSystemStore(
hProv,
"MY");
if(!hStore)
{
fprintf(stderr, "CertOpenSystemStore error\n");
return 2;
}
// 電子証明書の取り出し
PCCERT_CONTEXT pcCert;
pcCert = CryptUIDlgSelectCertificateFromStore(
hStore,
NULL,
NULL,
NULL,
0,
0,
NULL);
if(!pcCert)
{
CertCloseStore(hStore, 0);
CryptReleaseContext(hProv, 0);
return 1;
}
3.6.2 有効期限の検証
電子証明書の有効期間は確認せずに利用できますが、確認するには以下の方法で行います。
第2引数には、確認する電子証明書の証明書情報を指定します。
なお、特定の時刻(日付)と比較する場合は、以下の方法でFILETIME値を作成します。
// 利用期間の検証
switch(CertVerifyTimeValidity(
NULL, // 今現在の時刻と比較
pcCert->pCertInfo)) // 検証される電子証明書情報
{
case -1:
printf("電子証明書の利用開始日に至っていません。\n");
break;
case 0:
printf("電子証明書の利用期間内です。\n");
break;
case +1:
printf("電子証明書の利用期間を過ぎています。\n");
break;
}
関数の第1引数には、時刻を表すFILETIMEを指定します。現在の時刻と比較する場合は、NULLを指定します。第2引数には、確認する電子証明書の証明書情報を指定します。
なお、特定の時刻(日付)と比較する場合は、以下の方法でFILETIME値を作成します。
COleDateTime ft(2005, 6, 28, 0, 0, 0); //05年6月28日正時の場合 SYSTEMTIME ts; FILETIME tf; ft.GetAsSystemTime( ts ); ::SystemTimeToFileTime( &ts, &tf );
3.6.3 CA電子証明書を含めた有効期間の確認
有効期間の確認は、使用する電子証明書ばかりではなく、その電子証明書を発行したCA(中間CAを含む)の電子証明書をも確認します。
さらに、それぞれ(証明書、中間CA証明書、ルート証明書)が失効されていないことも確認しなければなりません。ネストされた証明書の有効期間確認および、証明書失効の確認方法は、こちらで説明します。
さらに、それぞれ(証明書、中間CA証明書、ルート証明書)が失効されていないことも確認しなければなりません。ネストされた証明書の有効期間確認および、証明書失効の確認方法は、こちらで説明します。
3.6.4 後始末
// 後始末 CertFreeCertificateContext(pcCert); CertCloseStore(hStore, 0); CryptReleaseContext(hProv, 0);
3.6.5 サンプル
3.6.6 ご質問・ご要望
ご質問やご要望は、こちらからお送りください。(匿名でも可能です。)
(記載の会社名および製品名は、各社の登録商標および商標です。)