« 神戸在住10 | Main | 選挙の記入台 »

2008.01.26

EXEファイルに署名

 UNIXマガジン(2008/01号)にコード署名に関する内容が載っていたので、試してみました。
 といっても、さすがに試すためだけにVeriSignグローバルサインの証明書を購入するわけにもいかず、OpenSSLなどで頑張ってみました(というか、そもそも個人では購入できないような気も)。

※SSL証明書のように、検証用の証明書がVeriSignなどで入手できればいいのですが、残念ながら、そういうのはないようです。

 とりあえずは、Windows用の実行ファイル(exeファイル)に対して署名してみるテストを。なお、全てWindows2000上での操作です。

【署名を行うためのツールを入手】
 グローバルサインのサイトにて、Authenticode用 署名ツールの入手方法等が記載されています。
 Authenticode用 署名ツールの入手方法
 Authenticode用 署名ツールのインストール方法
 Authenticode用 署名ツールの利用方法

 Windows® Server 2003 SP1 Platform SDK Web Installのページの下の方の「Files in This Download」のところから対応するファイルをダウンロードします。使用しているマシンは32bitCPUなので、PSDK-x86.exe をダウンロード。
 PSDK-x86.exeを実行し、インストール。インストールタイプとしては、Customを選択。
・Microsoft Windows Core SDK > Tools > Tools (Intel 64-bit)
・Microsoft Windows Core SDK > Redistributable Components
の2つのみをインストールします。

【OpenSSLを用いて証明書を作成】
 openssl.cnfの以下の部分を編集。
[ CA_default ] セクションの以下の2箇所。

unique_subject = yes
crlnumber = $dir/crlnumber

[ usr_cert ] セクションのnsCertType。
nsCertType = server, client, email, objsign

[ v3_ca ] セクションのnsCertType。
nsCertType = sslCA, emailCA

 実はnsCertTypeの設定に関してはよくわかっていません・・・。コード署名を行うので、とりあえずobjsignを指定しています。

 いくつかのフォルダ・ファイルの作成(カレントフォルダはOpenSSLのbinフォルダです)。

md .\demoCA
md .\demoCA\certs
md .\demoCA\crl
md .\demoCA\newcerts
md .\demoCA\private
type NUL > .\demoCA\index.txt
echo 01> .\demoCA\crlnumber

(オレオレ)ルート証明機関を作成。

openssl req -new -keyout .\demoCA\private\cakey.pem -out .\demoCA\private\careq.pem
openssl ca -create_serial -out ./demoCA/cacert.pem -days 1095 -batch -keyfile ./demoCA/private/cakey.pem -selfsign -extensions v3_ca -infiles ./demoCA/private/careq.pem
openssl x509 -in ./demoCA/cacert.pem -out ./demoCA/cacert.crt

署名用の証明書を作成&ルート証明機関での署名(ルート証明機関を作成する際に指定したパスワードが要求されます)。

openssl req -new -keyout sign.key -out newreq.pem -days 365
openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem
openssl x509 -in newcert.pem -out sign.crt

【署名を行う際のキーファイル形式を変更する】
OpenSSLで作成したキーファイルを、pvk形式のファイルに変換します。
PVK file information.Conversion Tools.のところにあるリンクから、Win32 binary(pvktool.zip)をダウンロードし、任意のフォルダに展開。得られたpvk.exeを用いて、pvk形式のファイルを生成します。

pvk.exe -in sign.key -out server.pvk -topvk -nocrypt

なお、sign.keyを作成する際に使用したパスワードが要求されますので、それを入力します。

【署名する】

C:\Program Files\Microsoft Platform SDK\Bin>signtool.exe signwizard

・署名対象とするファイル(exe)を選択。
・署名のオプションとしては「カスタム」を選択。
・証明書の選択で「ファイルの選択」を選択し、署名用の証明書(sign.crt)を使用。なお、ファイルの種類としては「X509証明書」を選択する。
・秘密キーとして、pvkで変換したpvkファイルを指定する。
・ハッシュアルゴリズムとしてsha1を選択。
・追加の証明書:証明のパスの証明書はルート証明書を含む証明のパスのすべての証明書、ほかの証明書は追加の証明書なしを選択。
・データの説明は任意の内容を入力。
・タイムスタンプはチェックせずに進む。

 とりあえず、これで「オレオレ証明書」を使用して署名したExeファイルを作成することができるようになります。ただし、当然ながら「信頼された認証機関」にたどり着くことができないので、そのまま配布してもあまり意味のあるものではありません(^^;

 署名がある場合とない場合とでどのように挙動が変わってくるかを検証するためのマシンに、途中で作成したcacert.crtをインポートすることである程度の検証を行うことができればいいなぁ、という程度のものです。

|

« 神戸在住10 | Main | 選挙の記入台 »

プログラム」カテゴリの記事

Comments

extendedKeyUsageにcodeSigningを追加、ドライバー関連であれば、

下記のURLのWindowsで使われてるOIDのリストに乗っているCrypto2.0からWHQL関連を追加。
http://support.microsoft.com/kb/287547/ja

Posted by: CyberBob | 2008.06.12 01:51

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference EXEファイルに署名:

« 神戸在住10 | Main | 選挙の記入台 »