Not only is the Internet dead, it's starting to smell really bad.:2019年05月02日分

2019/05/02(Thu)

[Windows] オレオレ証明書によるコード署名の手順 (その2 - certreq編)

先日の記事の続き、今回はcertreqを使用するのだけどそもそもcert「req」というくらいで認証局(CA)に対して署名要求(CSR)を行うためのコマンドなので、コード署名用証明書の作成目的で使うのは本来の用途ではないことに注意。

前回のmakecertを使った方法では

という形をとったのだけど、この方法のメリットは

というとこですかね、自宅内でそんなものが必要になるかはどうかは知らんけど(いわゆる誤家庭ってやつ)。

しかし今回は

することになるのでこのコマンド単体では他の鍵に署名を行うことができないのだ(縛りプレイ)。 よって今回は認証局を置かずにいきなりコード署名用証明書を発行し、その公開鍵をルート証明書として登録してもらうという形になるよ。

そんでコマンドに渡すパラメーターは引数オプションではなくinfファイル形式による応答ファイルが必要になる。

certreq -new apps.inf apps.req

と叩いて署名要求を作成する。

まず正しい使い方、認証局に送りつけるCSRを作成するだけなら

[Version]
Signature="$Windows NT$"

[NewRequest]
Subject="CN=Example Apps,O=Example Corp.,OU=Example Div.,C=JP,DC=com,DC=example"
KeySpec=AT_SIGNATURE
KeyUsage="CERT_DIGITAL_SIGNATURE_KEY_USAGE|CERT_KEY_ENCIPHERMENT_KEY_USAGE"
RequestType=CMC

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1

くらいで問題ないはず、これで作成された署名要求(apps.req)を認証局に送りつければコード署名用証明書を発行してくれる。認証局の手順書にしたがって作成してくれ。

今回はこれを書換えて自己署名証明書を作るようにする。

[Version]
Signature="$Windows NT$"

[NewRequest]
Subject="CN=Example Apps,O=Example Corp.,OU=Example Div.,C=JP,DC=com,DC=example"
RequestType=Cert
Exportable=true
ExportableEncrypted=true
HashAlgorithm=SHA256
KeyAlgorithm=ECDSA_P256
KeySpec=AT_SIGNATURE
KeyUsage="CERT_DIGITAL_SIGNATURE_KEY_USAGE|CERT_KEY_ENCIPHERMENT_KEY_USAGE"
SMIME=false
NotBefore="5/01/2019 12:00 AM"
NotAfter="12/31/2039 11:59 PM"
FriendlyName="Example Apps"

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.3

ポイントは以下の通り

あたりですかね、作成された署名要求は要らないので捨ててヨシ。

makecertに対するメリットは

あたり、ただし問題も多くて

というかんじ、またしても帯に短し襷にも短しじゃねーか。

[追記] certreqの場合でもCAかEnd Entityかの基本制限をinfのExtensionセクションに記述することで追加できますな。

ただしやっぱりWindows 8以降のcertreqでないとパースエラーで死ぬので意味ナッシングですが。

ちなみに証明書の管理(Certmgr)のGUIからもcertreq同様に署名要求が可能なんだけど、こいつの「カスタム要求の作成」ウィザードを使えば

のだけどね…

@次回予告

次はMicrosoftが推奨するPowerShellを使った方法、PowerShell歴もだいぶ長いはずなんだがまるで覚えられなくて何年た経っても初心者気分やぞ(老い)。

そして可能なら実際に作成したコード署名用証明書でスクリプトやドライバなどにコード署名してみる(さすがに次々回になるかな…)