自己証明書を作成して実行ファイルに署名する

# はじめに
自己証明書を作成して, 実行ファイルに署名してみました.
自己証明書の作成, 署名ともVisual Studioの開発用コマンドプロンプトを利用します.

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/25914692-def8-64c6-6f62-f915da1a39e8.png)

# 自己証明書の作成

コマンドプロンプトより, 自己証明書を作成するフォルダーに移動します.
今回は, Cドライブ直下にtestフォルダーを作成し, ここに作成していきます.

## 1. .pvk と .cer の作成
makecertコマンドを使用して, .pvk と .cer を作成します.
```
makecert /a sha256 /n "CN=Sample,O=Sample,C=JP" /r /h 0 /eku "1.3.6.1.5.5.7.3.3" -b 01/01/2023 -e 12/31/2030 /sv Sample.pvk Sample.cer
```
- オプションの説明

|オプション|説明|
|---|---|
|/a|ハッシュアルゴリズム|
|/n|証明書の名前<br>CN=Common Name<br>O=Organization Name<br>C=Country|
|/r|自己署名ルート証明書の作成|
|/h 0|証明書の基本的な制約|
|/eku|証明書の拡張キー<br>"1.3.6.1.5.5.7.3.3"=コード署名<br>"1.3.6.1.4.1.311.10.3.13"=ライフタイム署名<br>※コード署名, ライフタイム署名とするには, "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13"とカンマで続けて指定する|
|/b|証明書の有効期間の開始日 (mm/dd/yyyy形式)|
|/e|証明書の有効期間の終了日 (mm/dd/yyyy形式)|
|/sv|pvkファイルの名前, cerファイルの名前|

上記コマンドを実行すると, Create Private Key Passwordダイアログが表示されます.
ここに任意のパスワードを指定します. 今回は **1234** としました.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/18f64b57-90b9-5e0c-843e-aa1e8c0a1566.png)

引き続き, Enter Private Key Passwordダイアログが表示されるので, 上記で指定したパスワードを入力します.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/8ce20535-58e6-2e51-01b5-1335ccac90b9.png)

これでtestフォルダーにSample.pvkとSample.cerが作成されます.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/c9079b75-cef4-11af-f43e-69e511f3388a.png)


## 2. .pfx の作成
pv2pfxコマンドを使用して, .pfx を作成します.
```
pvk2pfx /pvk Sample.pvk /pi 1234 /spc Sample.cer /pfx Sample.pfx /po 1234
```
- オプションの説明

|オプション|説明|
|---|---|
|/pvk|pvkファイル指定|
|/pi|pvkファイルのパスワード|
|/spc|spcファイル指定|
|/pfx|出力するpfxファイル名|
|/po|pfxファイルのパスワード|

上記コマンドを実行すると, testフォルダーにSample.pfxが作成されます.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/8e9972e4-e5db-2cfe-34b5-a6b9e7e20dfc.png)

## 3. 実行ファイルの署名
signtoolコマンドを使用して, 実行ファイルに署名します.
今回は Sample.exe に署名してみます. testフォルダーにSample.exeをコピーしておきます.

```
signtool sign /fd sha256 /f Sample.pfx /p 1234 /t http://timestamp.digicert.com Sample.exe
```
- オプションの説明

|オプション|説明|
|---|---|
|/fd|ファイル署名に使用するアルゴリズム|
|/f|pfxファイル|
|/p|pfxファイルのパスワード|
|/t|タイムスタンプ<br>※この指定がないとタイムスタンプが入らない|
|(末尾)|署名するファイル|

上記コマンドを実行すると, 署名ができます.
署名前後のSample.exeのプロパティを比べると, 署名後には[デジタル署名]のタブが追加されています.

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/eac9de19-5f9e-e46e-3a0f-336c05315e3f.png)

## 4. ルート証明書の登録

デジタル署名の詳細を確認すると, 信頼していないルート証明書のため強制終了したということがわかります.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/40d9b50b-a3ba-a729-3983-15b706ed8ff9.png)

Sample.cerを信頼されたルート証明書として登録します.
Sample.cerをダブルクリックして, [証明書のインストール]をクリックします.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/bc2eea4a-7796-5123-889b-2993f87cca25.png)

証明書のインポートウィザードが表示されるので, 指示に従って登録します.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/b58c33e9-e53b-90e4-30d1-8307b2ce9fcd.png)
[証明書をすべて次のストアに配置する]を選択し, [参照]をクリックします.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/ee692b62-f87e-e776-af78-7a3eace6ec19.png)

[信頼されたルート証明機関]を選択し, [OK]をクリックします.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/2a984e5b-4909-186f-42b4-dd5032566379.png)

あとは[完了]をクリックすると, 「正しくインポートされました。」というメッセージが表示されます.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/81daff02-922d-ec3f-4ab6-5dab8337117c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/0c1c8826-86ca-1402-f916-4d1601eff23e.png)


ルート証明書として登録後, Sample.exeのデジタル署名の詳細を確認すると, デジタル署名の問題がなくなっています.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196571/4454775b-6616-d5a6-cdf3-760b8c5fa989.png)

# 最後に
Visual Studioの開発用コマンドプロンプトを利用することで, 自己証明書を作成して, 署名することができます.