EternalWindows
自己署名入り証明書 / 証明書の有効期間

証明書が信頼できるかの1つの判断として、CAの署名がありますが、 この他にも証明書の有効期間というものがあります。 証明書の有効期間とは、文字通りその証明書が利用可能な期間を意味しますが、 プログラミングの視点からすれば、有効期間が切れている証明書とは、決して扱えないわけではありません。 そのような証明書は、CryptoAPIに指定しても問題が起こるわけではありませんし、 有効期間というのは、それをチェックする機能を持ったアプリケーション内でしか意味を持ちません。 有効期間が切れていたり、達していなかったりする証明書の詳細を表示した場合、 そこでは有効期間に関する警告が表示されることになりますが、 それはあくまで警告であり、証明書の何らかの情報が無効になったり、 証明書自体が使えなくなるようなことを一概に示すものではありません。

有効期間に関するメンバは、CERT_INFO構造体のNotBeforeメンバとNotAfterメンバで表されます。 NotBeforeが期間の開始日であり、NotAfterが期間の終了日となります。 有効期間を現在の日時から1年後に設定する例を次に示します。

GetSystemTime(&systemTime);
SystemTimeToFileTime(&systemTime, &fileTime);
certInfo.NotBefore = fileTime;
systemTime.wYear += 1;
SystemTimeToFileTime(&systemTime, &fileTime);
certInfo.NotAfter = fileTime;

NotBeforeとNotAfterは共にFILETIME構造体として定義されているため、 最終的に必要となるのはFILETIME構造体です。 GetSystemTimeで取得できる現在の日時は、SYSTEMTIME構造体で表されるため、 これをSystemTimeToFileTimeでFILETIME構造体に変換してからNotBeforeに設定します。 NotAfterは、現在の日時から1年後のFILETIME構造体を必要とするため、 SYSTEMTIME構造体のwYearを1つ増やしてから変換処理を行っています。

証明書を作成する際には利用しませんが、 指定した日時が有効期間内であるかを調べるCertVerifyTimeValidityという関数があります。 この関数は、次のように定義されています。

LONG WINAPI CertVerifyTimeValidity(
  LPFILETIME pTimeToVerify,
  PCERT_INFO pCertInfo
);

pTimeToVerifyは、有効期間と比較する時間を格納したFILETIME構造体のアドレスを指定します。 NULLを指定した場合は、現在の時間と有効期間が比較されることになります。 pCertInfoは、CERT_INFO構造体のアドレスを指定します。 この構造体の有効期間とpTimeToVerifyが比較されます。 戻り値が-1の場合は有効期間に達していないことを意味し、 1の場合は有効期間を経過していることを意味します。 0の場合は、有効期間内ということで、証明書の利用を許可することができます。


戻る