もくじ
https://tera1707.com/entry/2022/02/06/144447
前提
下記環境で試した。
- VisualStudio2022が入ったPC使用
- 2025/01/02時点に実験
- windows11 24H2
- とりあえず自己署名ができるようになるまでをゴールとする。(署名について、理解するのはまた別途...)
登場人物(ファイルなど)
CA
認証局(CA: Certificate Authority)のこと。
認証してほしい人から、公開鍵と申請者の情報を含む証明書要求(CSR: Certificate Signing Request)を受けて、デジタル証明書を発行する。
そのデジタル証明書が「.cer」ファイル。
.cerファイル
デジタル証明書ファイル。
「cer」は、Certificate(証明書)の略。
自己署名の場合、makecert.exe -r
を使って自分で作成する。
正式な署名の場合、認証局(CA: Certificate Authority)にCSRで依頼して作成してもらう。
.pvkファイル
Private Key
ファイル。
下記のような役割を果たすらしい。(AIによると)
プライベートキーは、以下のような役割を果たします: デジタル署名の生成: プライベートキーを使用してデジタル署名を生成します。これにより、データの真正性と発行者の認証が行われます。 データの暗号化と復号: 対応する公開鍵で暗号化されたデータを復号するために使用されます。
cerファイルの中にある秘密鍵を抽出したもの?
pfxファイル
Personal Information Exchangeの略で、セキュリティ情報を格納するためのファイル。
AIによると、下記のようなファイルらしい。
デジタル証明書やプライベートキー、証明書チェーンを1つのファイルにまとめて格納します。PFXファイルは、他のシステムやアプリケーションに証明書情報を簡単にインポート・エクスポートするために使用されます。 PFXファイルの特徴: 複数の証明書を含む: デジタル証明書とその対応するプライベートキーを1つのファイルにまとめて格納します。 パスワードで保護: PFXファイルはパスワードで保護することができ、セキュリティを高めます。 互換性: 多くのプラットフォームやアプリケーションでサポートされており、Windows、macOS、Linuxなどで利用可能です。 PFXファイルは、証明書の移動やバックアップに便利で、セキュアな通信を確立するための重要な役割を果たします。
signtool.exeで実際にexeに署名をするときは、今回はこのpfxファイルを使って署名する。
makecertで自己署名する
makecertはWindowsSDKをインストールすると入るもの。(なので、VisualStudioを入れれば入るはず)
下記のサイトこのサイトを参考にさせて頂き、バッチを作ってやってみた。
※疑問点は残っているのだが、とりあえず、署名に成功して、署名してないとできない動きをさせることができた時点のbatを下記に残しておく。
※署名してないとできない動きとは、下記のこと。
- UiAccess=trueにしたアプリを署名して、
- ProgramFiles以下に保存して、
- タスクマネージャーにWM_CLOSEを送って、ウインドウを閉じさせる
※タスクマネージャーは、UiAccess=falseだと、通常起動したアプリからWM?CLOSEを送っても閉じることができない。管理者権限で起動したアプリからWM_CLOSEを追くると、閉じることができる。
call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat" makecert -a sha512 -e 12/31/2099 -cy authority -r -n "CN=testRootCA,O=testRootCA,C=JP,E=foo@bar.co.jp" -sv test_rootca.pvk test_rootca.cer makecert -a sha512 -e 12/31/2099 -cy end -n "CN=testInc,O=testInc,C=JP,E=hoge@huga.co.jp" -ic test_rootca.cer -iv test_rootca.pvk -sv test.pvk test.cer cert2spc test.cer test_rootca.cer test.spc pvk2pfx -pvk test.pvk -spc test.spc -po testpass -pfx test.pfx -f pause
call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat" signtool sign /fd SHA256 -f test.pfx -p testpass ConsoleApp1.exe signtool sign /fd SHA256 -f test.pfx -p testpass ConsoleApp1.dll pause
必要なパスが通った状態でコマンドを利用できる、VisualStudioの開発者用コマンドプロンプト(VsDevCmd.bat)を使用した。
makecertで自己署名する(別解)
開発者用コマンドプロンプトを使わずに、直接必要なexeの場所を指定して呼ぶようにした。
(開発者用コマンドPを使うと、地味に5秒くらい待たされるのでストレスだった)
01_MakeShomeiFiles.bat
set MakeCertPath="C:\Program Files (x86)\Windows Kits\10\bin\x86\makecert.exe" set Cert2spcPath="C:\Program Files (x86)\Windows Kits\10\bin\x86\cert2spc.exe" set Pvk2pfxPath="C:\Program Files (x86)\Windows Kits\10\bin\x86\pvk2pfx.exe" %MakeCertPath% -a sha512 -e 12/31/2099 -cy authority -r -n "CN=testRootCA,O=testRootCA,C=JP,E=foo@bar.co.jp" -sv test_rootca.pvk test_rootca.cer %MakeCertPath% -a sha512 -e 12/31/2099 -cy end -n "CN=testInc,O=testInc,C=JP,E=hoge@huga.co.jp" -ic test_rootca.cer -iv test_rootca.pvk -sv test.pvk test.cer %Cert2spcPath% test.cer test_rootca.cer test.spc %Pvk2pfxPath% -pvk test.pvk -spc test.spc -po testpass -pfx test.pfx -f pause
02_ApplyShomei.bat
set SigntoolPath="C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" set TargetExePath="C:\git\WindowsMessageSenderWinui\WindowMessageSender\WindowMessageSender\bin\x64\Debug\net6.0-windows10.0.19041.0\win10-x64\WindowMessageSender.exe" %SigntoolPath% sign /fd SHA256 -f test.pfx -p testpass %TargetExePath% pause
署名ファイル作成時にPWを聞かれる
「01_MakeShomeiFiles.bat」を実行すると、下記のような画面で、パスワードを2回ほど聞かれる。
その場合は、テスト用のオレオレ署名を作るうえでは、なにも入力せずに「OK」でOK。
(パスワードなしでよいか確認画面がでるが、それもOKでOK)
署名時にエラーが出た場合
SignTool.exeでのサイン時に、下記のようなエラーが出た。
「The signer's certificate is not valid for signing.」
その時は、「01_MakeShomeiFiles.bat」で作成した「test_rootca.cer」を右クリックして、
- 「証明書のインストール」を選択
- 「ローカルコンピューター」を選択
- 「証明書をすべて次のストアに配置する」を選択し、参照で「信頼されたルート証明機関」を選ぶ
- 「完了」を押す
で、証明書をインストールしてから「02_ApplyShomei.bat」を実行すると、エラーが消えた。
コード署名したexeを実行時にエラーが出た場合
オレオレ署名を、exeを署名してつかうために行っている場合、
作成した.cerファイル(上の「01_MakeShomeiFiles.bat」で作ったものの場合は「test.cer」)を、PCにインストールしておかないといけない。
その場合は、「test.cer」を右クリックして、
- 「証明書のインストール」を選択
- 「ローカルコンピューター」を選択
- 「証明書をすべて次のストアに配置する」を選択し、参照で「信頼されたユーザー」を選ぶ
- 「完了」を押す
でcerをインストールすると、エラーが消えた。
※UiAccess=trueの動作確認のために使用していた際は、下記のページにあるようなエラーがでた。そちらも参照。
https://tera1707.com/entry/2025/01/07/001227
⇒「UiAccess=trueなexeの実行時の注意」
現在インストールされている証明書をみる
Win+Rで「certmgr.msc」と入れて下記の画面を起動する。
ここから見たり消したりできそう。
疑問点
今回作ったspcファイルは、オレオレ署名するうえでは要らないのでは?
(いろいろ調べてても、spcを作らない手順がいっぱい出てくる)
⇒いるかも。
AIが提案してきた、spcを使わない別のやり方をいろいろ試したが、うまくいかなかった。
各コマンド、各ファイルの意味を調べる
作成中・・(上の登場人物の項目で調べてるから、この項目いらないかも)
※New-SelfSignedCertificate ではコード署名はできない
PowerShell 3.0から、New-SelfSignedCertificate コマンドレットで自己証明書を作成できるようになったというのを見たので、せっかくなら新しいやり方でやろうとしたのだが、New-SelfSignedCertificate は「コード署名」には利用できないらしい。
※コード証明とは、、、(AIで出力)
コード署名(Code Signing)とは、ソフトウェアプログラム(通常は実行可能ファイルやスクリプト)にデジタル署名を追加するプロセスです。 この署名は、ソフトウェアの提供者(開発者)がそのソフトウェアを提供していることを証明し、 そのソフトウェアが改ざんされていないことを確認するために使用されます。
で、下のMSのドキュメントによると、exeに署名するには、あとはmakecer.exeを使うっぽい。
それでやってみたのが上のバッチ。
参考
証明書作成ツール (Makecert.exe)
https://learn.microsoft.com/en-us/windows/win32/seccrypto/makecert
署名ツール
https://learn.microsoft.com/en-us/dotnet/framework/tools/signtool-exe
WindowsTips/実行ファイルにテスト目的のコードサイニング証明書を書き込みたい
http://www.hundredsoft.jp/win7blog/log/eid70.html https://vok.paburica.com/index.php?WindowsTips%2F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%86%E3%82%B9%E3%83%88%E7%9B%AE%E7%9A%84%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B5%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%81%9F%E3%81%84
pvk2pfx
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/devtest/pvk2pfx