exeに自己署名(オレオレ署名)する方法(調査中)

もくじ
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)を使用した。

流れのシーケンス図

調査&作成中...

疑問点

今回作ったspcファイルは、オレオレ署名するうえでは要らないのでは?
(いろいろ調べてても、spcを作らない手順がいっぱい出てくる)
⇒いるかも。 AIが提案してきた、spcを使わない別のやり方をいろいろ試したが、うまくいかなかった。

各コマンド、各ファイルの意味を調べる

作成中・・(上の登場人物の項目で調べてるから、この項目いらないかも)

※New-SelfSignedCertificate ではコード署名はできない

PowerShell 3.0から、New-SelfSignedCertificate コマンドレットで自己証明書を作成できるようになったというのを見たので、せっかくなら新しいやり方でやろうとしたのだが、New-SelfSignedCertificate は「コード署名」には利用できないらしい。

https://operationslab.wordpress.com/2014/12/16/powershell-%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E7%BD%B2%E5%90%8D%E7%94%A8%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/

※コード証明とは、、、(AIで出力)

コード署名(Code Signing)とは、ソフトウェアプログラム(通常は実行可能ファイルやスクリプト)にデジタル署名を追加するプロセスです。
この署名は、ソフトウェアの提供者(開発者)がそのソフトウェアを提供していることを証明し、
そのソフトウェアが改ざんされていないことを確認するために使用されます。

で、下のMSのドキュメントによると、exeに署名するには、あとはmakecer.exeを使うっぽい。

それでやってみたのが上のバッチ。

参考

証明書作成ツール (Makecert.exe)

https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-2.0/bfsktky3(v=vs.80)?redirectedfrom=MSDN

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