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 ご質問・ご要望
ご質問やご要望は、こちらからお送りください。(匿名でも可能です。)
(記載の会社名および製品名は、各社の登録商標および商標です。)