.NET TIPS

プログラムでデジタル証明書をインストールするには?

デジタルアドバンテージ 一色 政彦
2009/02/26

 セットアップ・プログラムやClickOnce配置などを中心に、セキュリティ管理の手段としてデジタル証明書(Digital Certificate)を活用する場面が増えている。Windows OSにはデジタル証明書を一元管理する機能が搭載されており、これを操作/閲覧するためのツールとして「証明書MMCスナップイン」(certmgr.msc)が提供されている。

 このツールは、通常「C:\Windows\System32\certmgr.msc」にインストールされており、起動すると次の画面のような「証明書MMCスナップイン」が表示される。素早く起動するには、[Windows]+[R]キーで[ファイル名を指定して実行]ダイアログを表示し、「certmgr.msc」と入力して[Enter]キーを押せばよい。

証明書MMCスナップイン(certmgr.msc)

 このツールを用いて手動でデジタル証明書をインストールするには、証明書MMCスナップイン(の左側のツリー)の適切なフォルダを右クリックして、表示されるコンテキスト・メニューから[すべてのタスク]−[インポート]をクリックする。

 これにより、次の画面のような[証明書のインポート ウィザード]が表示されるので、ウィザードの指示に従って進めば、デジタル証明書をインストールできる。

[証明書のインポート ウィザード]

 しかし、このような作業をエンド・ユーザーに実施してもらうのは、現実的にはなかなか難しい。そこで本稿では、C#やVB(Visual Basic)のプログラムでこれと同様の処理を実現する方法を紹介する。

 なお、本稿で使用するクラスは.NET Framework 2.0以降で導入されたものなので、.NET Framework 1.xでは使えない(ちなみに.NET Framework 1.xで同様の処理を実現するにはWin32 APIのCertAddCTLContextToStore関数などを利用する必要がある)。

C#やVBのプログラムからデジタル証明書をインポートする方法

 C#やVBのプログラムからデジタル証明書をインポートするには、(X.509形式の)デジタル証明書を表すX509Certificate2クラス(System.Security.Cryptography.X509Certificates名前空間)のオブジェクトと、ローカル・コンピュータ上の証明書ストア(後述)を表すX509Storeクラス(System.Security.Cryptography.X509Certificates名前空間)のオブジェクトを用いる(いずれのクラスともSystem.dllアセンブリに含まれているので、アセンブリ参照の追加は不要)。

 まずX509Certificate2オブジェクトを取得するには、パラメータにデジタル証明書ファイル(.cerファイル)へのパスを指定して、X509Certificate2クラスのコンストラクタを呼び出せばよい。次のコードはその例だ。

string cerFile = @"C:\DigitalCertificate.cer";
X509Certificate2 cert = new X509Certificate2(cerFile);
Dim cerFile As String = "C:\DigitalCertificate.cer"
Dim cert As New X509Certificate2(cerFile)
X509Certificate2オブジェクトの取得(上:C#、下:VB)

 次にX509Storeオブジェクトを取得するには、第1パラメータにStoreName列挙体(System.Security.Cryptography.X509Certificates名前空間)の値を、第2パラメータにStoreLocation列挙体(System.Security.Cryptography.X509Certificates名前空間)の値を指定して、X509Storeクラスのコンストラクタを呼び出せばよい。

 StoreName列挙体は、証明書ストア、つまりデジタル証明書の保存場所を表す。この保存場所は、証明書MMCスナップインの各フォルダと一致している。StoreName列挙体には次の8個の証明書ストアが用意されている。

  • My:個人
  • Root:信頼されたルート証明機関
  • CertificateAuthority:中間証明機関
  • AddressBook:ほかの人
  • TrustedPublisher:信頼された発行元
  • Disallowed:信頼されていない証明書
  • AuthRoot:サードパーティ・ルート証明機関
  • TrustedPeople:信頼されたユーザー

 (筆者の経験として)証明書ストアとしてよく使われるのは、「信頼されたルート証明機関(StoreName.Root)」と「信頼された発行元(StoreName.TrustedPublisher)」である。

 一方、StoreLocation列挙体は、証明書ストアの種類を示す。具体的には次の2つがある。

  • CurrentUser:現在のユーザーに割り当てられる証明書ストア
  • LocalMachine:ローカル・マシンに割り当てられた証明書ストア

 全ユーザー共通でデジタル証明書を設定したい場合には「StoreLocation.LocalMachine」を指定する。

 次のコードは、「ローカル・マシン」に割り当てられた「信頼された発行元」の証明書ストア(X509Storeオブジェクト)を示す取得する例だ。

X509Store store = new X509Store(
  StoreName.TrustedPublisher, StoreLocation.LocalMachine);
Dim store As New X509Store( _
  StoreName.TrustedPublisher, StoreLocation.LocalMachine)
X509Certificate2オブジェクトの取得(上:C#、下:VB)

 以上のX509Certificate2オブジェクトとX509Storeオブジェクトを使って証明書を登録するコンソール・アプリケーションのコードは、例えば次のようになる。

using System.Security.Cryptography.X509Certificates;

class Program
{
  static void Main()
  {
    string cerFile = @"C:\DigitalCertificate.cer";
    X509Certificate2 cert = new X509Certificate2(cerFile);

    X509Store store = new X509Store(
      StoreName.TrustedPublisher, StoreLocation.LocalMachine);

    store.Open(OpenFlags.ReadWrite);
    store.Add(cert);
    // 削除する場合はAddメソッドの代わりにRemoveメソッドを使う
    //store.Remove(cert);
    store.Close();
  }
}
Imports System.Security.Cryptography.X509Certificates

Module Module1

  Sub Main()
    Dim cerFile As String = "C:\DigitalCertificate.cer"
    Dim cert As New X509Certificate2(cerFile)

    Dim store As New X509Store( _
      StoreName.TrustedPublisher, StoreLocation.LocalMachine)

    store.Open(OpenFlags.ReadWrite)
    store.Add(cert)
    ' 削除する場合はAddメソッドの代わりにRemoveメソッドを使う
    'store.Remove(cert)
    store.Close()
  End Sub

End Module
X509Certificate2オブジェクトの取得(上:C#、下:VB)

 太字部分(いずれもX509Storeオブジェクトのメソッド呼び出し)では、証明書ストアを開いて(Openメソッド)、証明書ストアにデジタル証明書を追加して(Addメソッド)、証明書ストアを閉じている(Closeメソッド)。

 Openメソッドの第1パラメータにはOpenFlags列挙体(System.Security.Cryptography.X509Certificates名前空間)の値を指定する。OpenFlags列挙体には以下の値がある。

  • ReadWrite:読み書き可能で開く
  • ReadOnly:読み取り専用で開く
  • MaxAllowed:許可された最も高いレベルのアクセスで開く
  • OpenExistingOnly:既存の証明書ストアだけを開く(証明ストアが存在しない場合は新しい証明書ストアを作成しない)
  • IncludeArchived:証明書ストアを開き、アーカイブされたデジタル証明書を格納する

 上記のコードでは「OpenFlags.ReadOnly」となっているが、証明書をインストールする場合には通常これを指定する。

 また、Addメソッドの第1パラメータには、デジタル証明書を示すX509Certificate2オブジェクトを指定する。

 Addメソッドの代わりに、Removeメソッドを呼び出せば、証明書ストアからデジタル証明書を削除できる。

 以上のプログラムを実行すると、証明書MMCスナップインの「信頼された発行元」フォルダに追加したデジタル証明書が表示される。

 なおデジタル証明書自体は、(テスト用だが)ClickOnceの機能などで入手できる。また、「TIPS:ClickOnceのデジタル証明書を更新するには?」ではデジタル証明書の期限を延期するプログラム(RenewCert.exe)の作り方を紹介している。End of Article

カテゴリ:クラス・ライブラリ 処理対象:セキュリティ
使用ライブラリ:X509Certificate2クラス(System.Security.Cryptography.X509Certificates名前空間)
使用ライブラリ:X509Storeクラス(System.Security.Cryptography.X509Certificates名前空間)
使用ライブラリ:StoreName列挙体(System.Security.Cryptography.X509Certificates名前空間)
使用ライブラリ:StoreLocation列挙体(System.Security.Cryptography.X509Certificates名前空間)
使用ライブラリ:OpenFlags列挙体(System.Security.Cryptography.X509Certificates名前空間)
関連TIPS:ClickOnceのデジタル証明書を更新するには?

この記事と関連性の高い別の.NET TIPS
ClickOnceのデジタル証明書を更新するには?
SSL通信で信頼されない証明書を回避するには?
[Azure]Windows AzureアプリケーションをVisual Studioからデプロイするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間