デジタル署名に関して ~テスト用の証明書を作る~

開発サポートを行っているのですが、最近はデジタル署名に関する問い合わせをよく受けます。
社内で Vista & 2008 対応製品の開発が進んでいるという裏付けにもなります。ただ、残念なのが
デジタル署名に関する知識が不足しているなぁと感じることです。どうも
「あの面倒な UAC の権限昇格ダイアログがあるので、とりあえず、デジタル署名しておこう」
という感じで、本来の意味ではなく、仕方なしにデジタル署名をするという方が多いようです。そもそも、デジタル署名って

あなたに提供するファイルは、改ざんされていないことを証明します!

という改ざん防止を目的としているために、発行元を表示するわけで…。別に UAC があるからっていうよりも本来の意味を知ってほしいものです。
ちなみに、署名するのは、最終的にビルドした人(会社)でないと意味ないです。ビルドした人でなければ、証明できないですからね。
さて、脳書きはこの辺にしておいて、サポートらしく、テスト用証明書の作り方を紹介しましょう。
本番用の証明書は、厳正なものですから、簡単には使えないと思います。テストには、テスト用の証明書を使いましょう。
あくまでもテスト用の証明書ということを忘れないでくださいね。

  1. MakeCert.exe (コマンドラインツール)を使い自己署名証明書を作る
  2. Active Directory 証明書サービス を使い、コード署名用証明書を発行する

では、MakeCert.exe を使う方法から…。

MakeCert.exe は、Visual Studio、Windows SDK、WDK で提供されている証明書作成ユティリティです。
MSDN の説明は、こちらです。 今回は、次の用な証明書を作成します。

  • 証明書のチェーン
    ルートCA – EE
  • ルートCA の情報
    会社名: XYZ Company
    組織名: XYZ Authority Root CA
    県名: Tokyo
    国名: JP
    有効期限: 2015.12.31
  • EE の情報
    コモン名: ABC Company
    会社名: ABC Company
    組織名: ABC Development
    県名: Kanagawa
    国名: JP
    有効期限: 2008.12.31

まずは、ルートCA を作成します。(MakeCert を使う際には、パスを通しておいてください)

makecert -r -n "C=JP, S=Tokyo, OU=XYZ Authority Root CA, O=XYZ Company" -e 12/31/2015 -a sha1 -cy authority -sv xyzCA.pvk xyzCA.cer

このコマンドを入力すると、秘密キーのパスワード作成画面が出てきますので、パスワードは覚えるなり、控えるなりしてください。すると、以下のファイルが出来上がります。

ルート CA の証明書 xyzCA.cer
プライベートキーファイル xyzCA.pvk

次に、このルート CA を用いて、EE証明書を作成しましょう。

makecert -n "CN=ABC Company, C=JP, S=Kanagawa, O=ABC Company, OU=ABC Development" -e 12/31/2008 -sv ABC.pvk -ic xyzCA.cer -iv xyzCA.pvk -nscp -cy end ABC.cer

これで、EE証明書(署名用の証明書)ができました。

証明書ファイル ABC.cer
プライベートキーファイル ABC.pvk

ついでに、発行証明書(SPC)も作成しておきましょう。

Cert2SPC ABC.cer xyzCA.cer ABC.spc

デジタル署名では、spc ファイルと pvk ファイルをよく使います。

発行用証明書ファイル ABC.spc

もうひとつ。PFX(Personal Information Exchange: PKCS#12)も作成しておきましょう。
pfx ファイルには、すべての階層を含めることができるので、何かと便利です。

Pvk2pfx -pvk abc.pvk -pi パスワード -spc abc.spc -pfx abc.pfx -po パスワード -f

PKCS#12 ファイル ABC.pfx

これで、テスト用の証明書がすべて完成しました。
あとは、署名ツール(signtool.exe)を使って、デジタル署名しましょう。
なお、1点だけ注意があります。今回作成したルート CA は、使用する環境にインストールしておく必要がありますが、その際には、コンピュータアカウント に対してインストールする必要があります。つまり、

  1. mmc /a で MMC コンソールを起動する
  2. スナップインの追加と削除から、証明書を選択するが、この際、コンピュータアカウントを選択する
  3. ルートCA をインポートする(信頼されたルート証明機関-証明書 で右クリックしてインポートする)

を忘れないでください。コンピュータアカウントにルート CA が登録されていないと、せっかく、ファイルにデジタル署名を付与しても、UAC の権限昇格ダイアログでグレーの帯になりません。

続いて、Active Directory 証明書サービスを使う方法を紹介します。

実は、非常に簡単です。証明書サービスの管理画面の証明書発行テンプレートから、"コード署名"を選択し、コード署名用証明書の発行ができる状態にします。あとは、http://サーバー名/certsrv にアクセスして、コード署名用証明書を選択するだけです。ただし、この方法で証明書発行した場合には、Windows の証明書ストアに格納されることになります。さらに

  • 発行できるのは、ドメイン所属のコンピューターから
  • コード用証明書をファイルにエクスポート出来ない(証明書テンプレートを変更すればエクスポート可能)

という条件が付きます。ただ、開発環境がドメインになっていると何かと便利なことが多いです。


さて、今回はデジタル署名に関するネタを書きました。今後、デジタル署名は至る所でお目にかかることが多くなると思います。ぜひ、本来の目的を認識して、正しいアプリケーション開発を行ってくださいね。

ドライバ署名のネタもありますが、それはまたの機会に。

One Response to デジタル署名に関して ~テスト用の証明書を作る~

  1. ピンバック: しすこん » Blog Archive » デジタル署名の作り方

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。