デジタル署名に関して その2 ~有効性って何よ~

デジタル署名ネタの第二弾です。
きちんと理解されている方が少ないようで、相変わらずの問い合わせ上位ランキングです。

デジタル署名が有効であると言ったら、何を思い浮かべますか?

実際には、次の2つがあるのです。

  1. 使用するデジタル証明書の有効性
  2. 付与したデジタル署名の有効性

1) に関しては、有効期限、失効者リスト(CRL: Certificate Revocation List)というものが
大きな要因なのですが、Authenticode 対応デジタル ID の有効期限は 1 年間 (12ヶ月間) に
なっているので、期限切れになるということは避けられません。

2) に関しては、有効なデジタル証明書を用いてデジタル署名したかどうかというものです。
つまり、署名時に使用した証明書は、有効期限内の失効していないものを使ったかどうかです。

では、証明書の有効期限が切れてしまったらどうなるのでしょう。
有効期限が切れたからといって、デジタル署名が無効になってしまうのでしょうか?
もし、そうだったら、皆が不幸になりますね。
(証明書を販売しているところだけが Happy なのかな!?)
ベンダー側は、またデジタル署名し直さなければならず、ユーザー側は、またアプリ構築し直さなければならず…。

こんなことにならないようにするために、デジタル証明書を発行した会社が
タイムスタンプサービスというものを提供しています。
タイムスタンプサービスとは

デジタル署名を付与した日時・時間を認証・証明するサービス

です。
タイムスタンプサービスを使うことによって、証明書の有効期限が切れてしまっても、
付与したデジタル署名は有効であると保障される
わけです。

タイムスタンプサービスを使わないと、証明書の有効期限が切れてしまったら、
付与したデジタル署名も無効になるというわけです。

では、次の質問はどうなるでしょう。

Q. Windows Vista & 2008 用のアプリケーション (.exe) を作成しました。
 このアプリケーションは管理者権限が必要になるため、マニフェストによる実行権限の定義と
 デジタル署名を付与しました。
 デジタル署名に使用した証明書の有効期限内であれば、UAC 権限昇格ダイアログは、グレーの帯になります。
 では、証明書の有効期限が切れたら、どうなるでしょう?

1) と 2) を理解していれば、この回答はすぐにわかりますね。

デジタル署名を付与する際にタイムスタンプサービスを使用していれば、証明書の有効期間が過ぎても
UAC 権限昇格ダイアログは、グレーのままです。
タイムスタンプサービスを使用していなければ、証明書の有期期限が切れたら
UAC 権限昇格ダイアログは、オレンジ色の帯になります。

———————————————

デジタル署名に関して正しい理解をしてから、署名しましょうね。
証明書って、実印みたいなものですから、意味もわからず使うなんて…考えただけでもゾッとします。

今回はこの辺で。

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

開発サポートを行っているのですが、最近はデジタル署名に関する問い合わせをよく受けます。
社内で 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 の証明書ストアに格納されることになります。さらに

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

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


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

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