証明書ストアに格納されている証明書の列挙 (2/2)

※この記事は 証明書ストアに格納されている証明書の列挙 (1/2) の続きです。 証明書ストア、証明書に関する説明は前のページをご覧ください。

ここでは証明書ストアに格納されている証明書の一覧を表示するプログラムを作成して、 証明書ストアへのアクセス方法をみてみましょう。

Crypto API による証明書ストアの操作

証明書ストアから証明書を読み出して、その発行元を出力するプログラムを考えます。

このプログラムのコードの流れは次のようになります。

  1. CertOpenSystemStore 関数で証明書ストアを開く
    このとき証明書ストアの種類として現時点で Windows では四種類定義されています。
    CACA 証明書
    MY秘密鍵と関連付けされた証明書ストア
    ROOTルート 証明書
    SPCソフトウェア発行者証明書
    ここで作るプログラムでは、それぞれの証明書ストアから格納されている情報を読み出します。
  2. CertEnumCertificatesInStore 関数で証明書ストア内の証明書を列挙する
  3. 可読な形式で名前を取得するには CertGetNameString を呼び出す
  4. 証明書ストアを閉じる

以上で証明書の一覧を取得可能です。

#include <windows.h>
#include <stdio.h>
#include <WinCrypt.h>


///////////////////////////////////////////////////////////////////////////////


BOOL ShowCertName ( PCCERT_CONTEXT pCC ) {

     char szBuff[2048];

     ULONG lBytes = CertGetNameString(
          pCC, 
          CERT_NAME_SIMPLE_DISPLAY_TYPE, 

          CERT_NAME_ISSUER_FLAG, 
          szOID_COMMON_NAME,
          szBuff, 
          2048);

     if( !lBytes ) {
          printf( "CertGetNameString Failed.\n" );

          return FALSE;
     }

     printf( "%s\n", szBuff );

     return TRUE;
     
}



///////////////////////////////////////////////////////////////////////////////


BOOL EnumCertInfo ( char* pszStore ) {

     if( !pszStore ) {
          return FALSE;
     }


     printf( "\n%s\n", pszStore );
     printf( "========================================\n" );
     
     //
     // システム証明書ストアを開く
     //

     
     HCERTSTORE hStore = CertOpenSystemStore (
          NULL,
          pszStore );
     
     if( hStore == NULL ) {
          printf( "CertOpenSystemStore Failed." );

          return FALSE;
     }

     //
     // 証明書を列挙する
     //

     PCCERT_CONTEXT pCertContext = NULL;

     while( pCertContext 
          = CertEnumCertificatesInStore( 
               hStore, 
               pCertContext ) ) {

          ShowCertName ( pCertContext );


     }

     CertCloseStore( hStore, 0 );

     return TRUE;

}


///////////////////////////////////////////////////////////////////////////////


void main() {

     char* ppszStore[] = { 
          "SPC", 
          "ROOT", 
          "CA", 
          "MY" };


     for( int i=0; i < sizeof(ppszStore)/sizeof(ppszStore[0]); i++ ) {

          EnumCertInfo ( ppszStore[i] );

     }

}

このプログラムをビルドする時には、Crypto API を利用するために Crypt32.lib をリンクする必要があります。

証明書スナップインで証明書を見る

ちなみに、当然ながら Windows にも証明書ストアをみる場所はあります。(でもなぜかゴッドモードからのショートカットは無いようですが・・・)

mmc を開き、追加/削除で 証明書を選択します。これだけで、次のような画面が見られるはずです。

通常はあまり直接証明書をチェックする機会は無いと思いますが、例えば組織内部での証明書の配布などを行い、 Windows の証明機関サービスなどで発行した証明書を配布する場合、独自で立てた証明期間の証明をを配布することもあると思います。

このような場合では、正しく証明書が配布されているかチェックする仕組みを作るためには、プログラムから証明書をチェックすることも有用かもしれませんね。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説