exeファイルのコードサイニング　自己署名証明書を使う　備忘録　メモ

**exe ファイルに自己署名証明書を発行して、コードサイニングを行う手順**　をわかりやすくまとめます。  
この内容は、Windows 環境で **OpenSSL と signtool.exe** が使用可能な前提で進めていきます。

---

# はじめに

ソフトウェアを配布する際に、**コードサイニング（デジタル署名）** を施しておくと、ユーザに対して「正規の発行元が作成した改ざんされていないファイル」であることを証明でき、セキュリティの信頼度が高まります。  
今回の方法は、自前で証明書を作る「**自己署名証明書**」を使ったサイン手順のため、実際の運用では**正式な認証局(CA)が発行する証明書**を用いることが望ましいことに注意してください。

---

# 1. 前提条件

- **OpenSSL** がインストールされている
  - [Win32 OpenSSL](https://slproweb.com/products/Win32OpenSSL.html) 等を利用する。
- **signtool.exe** がインストールされている
  - 通常、[Windows SDK](https://developer.microsoft.com/ja-jp/windows/downloads/sdk-archive/) をインストールすると付属しています。

---

# 2. コードサイニング手順

ここからは具体的なコマンドとともに、exe ファイルに署名する一連の流れを解説します。

## ステップ 1. 秘密鍵の生成

まずは署名に必要となる**秘密鍵 (private key)** を作成します。  
キー長は 2048ビットの RSA を例にします。

```bash
openssl genrsa -out <private>.key 2048
```

- `<private>.key` のファイル名は任意です。  
- このファイルは最重要情報なので厳重に保管してください。

## ステップ 2. 証明書署名要求 (CSR) の作成

作成した秘密鍵から、証明書署名要求（CSR）を生成します。

```bash
openssl req -new -key <private>.key -out <cert>.csr
```

- コマンド実行中に5つほど質問が表示されます。  
  - **Country Name**、**Organization Name** などが代表的な項目です。  
  - テスト用であれば仮の入力でも構いませんが、必ず入力してください。

## ステップ 3. 自己署名証明書の生成

CSR から「**自己署名証明書**」を作成します。

```bash
openssl x509 -req -days 365 -in <cert>.csr -signkey <private>.key -out <cert>.crt
```

- `-days 365` は、証明書の有効期限を 1 年に設定しています。必要に応じて変更してください。
- 作成される `certificate.crt`（例: `<cert>.crt`）が自己署名証明書です。

## ステップ 4. PFXファイルの作成

`signtool.exe` で署名するときは、**.pfx（PKCS#12形式）** の証明書ファイルが必要です。  
以下のコマンドで「秘密鍵＋証明書」を一つにまとめた PFXファイルを作ります。

```bash
openssl pkcs12 -export -out <certificate>.pfx -inkey <private>.key -in <cert>.crt
```

- 作成時にパスワード入力を求められます（例: `<password>`）。
- `.pfx` ファイルも厳重管理対象です。

## ステップ 5. exe ファイルへの署名

最後に、**signtool.exe** を使って exe ファイルに署名します。

```bash
signtool sign /fd SHA256 /f <certificate>.pfx /t http://timestamp.digicert.com /p <password> <実行ファイル>.exe
```

- `/fd SHA256` : 署名アルゴリズムの指定（SHA256 推奨）  
- `/f` : 使用する PFX ファイルのパス  
- `/t` : タイムスタンプサーバー（ここでは DigiCert の例）  
- `/p` : PFX ファイルのパスワード  
- `<実行ファイル>.exe` : 実際に署名したい exe ファイルのパス

これで**exe ファイルに自己署名証明書でのコードサイニング**が完了します。  
右クリック → **プロパティ → デジタル署名タブ** などから署名が挿入されていることを確認できます。

---

# 3. 注意点

- **自己署名証明書**を使った場合：  
  - Windows SmartScreen の警告を完全には回避できません。  
  - 発行元「自己署名」と表示されるため、第三者にとっては信頼度が低いです。  
- **正式な運用**で配布する場合：  
  - 認証局(CA)から発行された**コードサイニング証明書**を用いるのが望ましいです。  
  - 実費がかかる一方、ユーザがダウンロード・実行時に「安全」と判定される可能性が高まります。

---

# 4. 手順まとめ表

各ステップを簡単にまとめた表を作成しました。  
こちらを CSV としてダウンロード・利用していただけます。

| 手順 | コマンド例                                                                                   | 説明                                                         |
| --- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| 1. 秘密鍵の生成       | `openssl genrsa -out <private>.key 2048`                                                  | RSA 秘密鍵を作成                                             |
| 2. CSRの作成          | `openssl req -new -key <private>.key -out <cert>.csr`                                   | 証明書署名要求(CSR)を作成                                    |
| 3. 自己署名証明書作成 | `openssl x509 -req -days 365 -in <cert>.csr -signkey <private>.key -out <cert>.crt`      | CSR から自己署名証明書を生成（1年間有効）                    |
| 4. PFXファイルの作成  | `openssl pkcs12 -export -out <certificate>.pfx -inkey <private>.key -in <cert>.crt`      | .pfx形式にまとめる（signtool.exe用）                         |
| 5. exeに署名          | `signtool sign /fd SHA256 /f <certificate>.pfx /t http://timestamp.digicert.com /p <password> <exe>` | exeファイルにコードサイニング                                |

# 5. まとめ

1. **秘密鍵** と **自己署名証明書** を OpenSSL で作成。  
2. その証明書を **.pfx** にまとめ、**signtool.exe** を使って exe ファイルに署名。  
3. Windows の「プロパティ → デジタル署名」や `signtool verify` で署名が確認できれば成功です。

自己署名であっても、**開発テストや検証目的**には十分活用できます。  
ただし、**本番配布**では CA のコードサイニング証明書を使う方がユーザの安心・信頼が向上します。  
ぜひご活用ください。