オレオレ証明書の作成方法

## この記事は

自己署名証明書、いわゆるオレオレ署名/オレオレ証明書とよばれるものを作成する手順のメモ。

対象環境

- 2025.01.18記
- Windows 11
- Visual Studio 2022 Community

-----------------------------------------

## 1.【共通初期処理】

1. コマンドプロンプトを管理者権限で起動する
2. 各種Pathを通すため、開いたコマンドプロンプトで以下のバッチを実行する
    ```cmd
    C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat
    ```
    - Visual Studio 2019以前の場合だと以下を実行する
        ```cmd
        C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat
        ```

3. 作業フォルダに移動する
    ```cmd
    cd /d (作業フォルダ)
    ```

-----------------------------------------

## 2.【認証局（Root）証明書の作成】

1. ルート証明書用のセキュリティ証明書ファイル(.cer)と秘密鍵ファイル（.pvk）を作成する
    ```cmd
    makecert -n "CN=(名前) Root CA,O=(名前),C=JP" -r -cy authority -a sha256 -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.3,1.3.6.1.5.5.7.3.4 -sv (名前)RootCA.pvk (名前)RootCA.cer
    ```
    > makecert -n "CN=(名前) Root CA,O=(名前),C=JP" -r -cy authority -a sha256 -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.3,1.3.6.1.5.5.7.3.4 -sv (名前)RootCA.pvk (名前)RootCA.cer

    - (名前) の部分は変えてください
    - ekuオプションには、このルート証明書から派生して作成する予定の証明書の種類を指定する

        | 作成する証明書の種類 | eku           |
        |-----------------| ------------------|
        | サーバー認証     | 1.3.6.1.5.5.7.3.1 |
        | クライアント認証 | 1.3.6.1.5.5.7.3.2 |
        | コード署名       | 1.3.6.1.5.5.7.3.3 |
        | メールの保護     | 1.3.6.1.5.5.7.3.4 |

1. ルート証明書のパスワードを作成する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/d69b1e35-7519-cb7e-2170-8e3ae768f0f2.png)

1. パスワードの入力を求められるので、今作成したパスワードを入力する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/391e83d0-7bee-1f64-fe95-1a3a84bff60f.png)
1. cerファイルとpvkファイルが出来上がる
    - (名前)RootCA.cer
    - (名前)RootCA.pvk

-----------------------------------------

### 2.1. 【オレオレ署名を有効にする】

1. 作成した cer ファイルを "信頼されたルート証明機関" にインストールする
    
ルート証明書を "信頼されたルート証明機関" にインストールすることで以降の手順で作成する各証明書が有効な証明書として認識されます。

- 【署名するPC】
    証明書をインストールする必要はありません

- 【署名されたファイルを使用するPC】
    ルート証明書を信頼できるルート証明機関にインストールする必要があります

-----------------------------------------

## 3. オレオレコード署名
### 3.1. 【コード署名証明書の作成】

1. コード署名用のセキュリティ証明書ファイル(.cer)と秘密鍵ファイル（.pvk）を作成する
    ```cmd
    makecert -n "CN=(名前) Code Signing,O=(名前),C=JP" -a sha256 -eku 1.3.6.1.5.5.7.3.3 -sv (名前)CodeSigning.pvk -ic (名前)RootCA.cer -iv (名前)RootCA.pvk (名前)CodeSigning.cer
    ```
1. コード署名証明書のパスワードを作成する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/b80fa4d4-400d-b159-01c7-6d8b9eab8827.png)
1. パスワードの入力を求められるので、今作成したパスワードを入力する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/cb379ecc-1ab0-4f61-2a9b-c699b8254d01.png)
1. ルート証明書のパスワードを求められるので、入力する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/b7d50c14-e762-ff61-558b-ccbd9b5ef422.png)
1. cerファイルとpvkファイルが出来上がる
1. X.509形式のセキュリティ証明書ファイル（.cer）をラッピングし、ソフトウェア発行元証明ファイル（.spc）に変換する
    ```cmd
    cert2spc (名前)CodeSigning.cer (名前)CodeSigning.spc
    ```
      
1. 秘密鍵ファイル（.pvk）とソフトウェア発行元証明ファイル（.spc）を電子証明書キーペアファイル（.pfx）にパッケージング
    ```cmd
    pvk2pfx -pvk (名前)CodeSigning.pvk -spc (名前)CodeSigning.spc -pfx (名前)CodeSigning.pfx -f /po (pfxにパスワードをつける)
    ```
    - ファイル署名証明書のパスワード を入力
      ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/ad151ce5-d286-1314-dc50-51ac6150015d.png)

1. コード署名用の cer, pvk, spc, pfx が出来上がる
    - (名前)CodeSigning.cer
    - (名前)CodeSigning.pvk
    - (名前)CodeSigning.spc
    - (名前)CodeSigning.pfx


-----------------------------------------
## 3.2.【ファイルに署名する方法】

1. 署名する
    ```cmd
    signtool.exe sign /fd sha256 /f (名前)CodeSigning.pfx /p (pfxのパスワード) /td sha256 /tr http://timestamp.digicert.com?alg=sha256 /v (署名するファイル).exe
    ```

-----------------------------------------

## 4. オレオレサーバー署名
### 4.1.【サーバー証明 兼 メール保護 証明書の作成】

1. サーバー証明用 兼 メール保護用のセキュリティ証明書ファイル(.cer)と秘密鍵ファイル（.pvk）を作成する
    ```cmd
    makecert -n "CN=TakumiSoft68 Server and Mail CA,O=TakumiSoft68,C=JP" -a sha256 -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.4 -sv TakumiSoft68Server.pvk -ic TakumiSoft68RootCA.cer -iv TakumiSoft68RootCA.pvk TakumiSoft68Server.cer
    ```
1. サーバー証明書のパスワードを作成する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/347b67bd-5f4f-9938-914f-003924726911.png)
1. パスワードの入力を求められるので、今作成したパスワードを入力する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/cb379ecc-1ab0-4f61-2a9b-c699b8254d01.png)
1. ルート証明書のパスワードを求められるので、入力する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/b7d50c14-e762-ff61-558b-ccbd9b5ef422.png)
1. cerファイルとpvkファイルが出来上がる

1. 秘密鍵ファイル（.pvk）とセキュリティ証明書ファイル(.cer)を電子証明書キーペアファイル（.pfx）にパッケージング
    ```cmd
    pvk2pfx -pvk (名前)Server.pvk -spc (名前)Server.cer -pfx (名前)ServerCA.pfx -f /po (pfxにパスワードをつける)
    ```
    - サーバー署名証明書のパスワード を入力
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/6ceff7ea-2f5e-0424-3f19-ecc463ccf6de.png)

1. サーバー署名用の cer, pvk, pfx が出来上がる
    - (名前)Server.cer
    - (名前)Server.pvk
    - (名前)Server.pfx

-----------------------------------------

### 4.2 【オレオレ署名付きCSR を作成】

1. CSRファイル を作成
    1. iis を使って作成する
        - 参考
            - https://jp.globalsign.com/support/ssl/manual-csr/iis10.html
            - https://jp.globalsign.com/support/ssl/manual-csr/index.html

1. (名前)Server.cer から (名前)Server.cer.pem を作成
    1. エクスプローラで (名前)Server.cer をダブルクリック
    1. 詳細タブのファイルにコピー を選択
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/b7346796-6e8f-597c-e764-ed04fbace28e.png)
    1. Base 64 encoded X.509 を選択
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/501e7a05-577f-2067-3e46-6e70efb129a4.png)
    1. ファイル名を指定して保存
    1. (名前)Server.cer.pem.cer という拡張子で保存されてしまうので、最後の .cer を消して拡張子が .pem のファイルにする

1. 秘密鍵ファイル（pvk）から（key）形式を作成
    - 直接行う方法が見つからなかったので、いったんpfxを作成し、openssl でkeyファイルを抜き出す
    1. openssl が使えるようにする
        - 参考 : https://atmarkit.itmedia.co.jp/ait/articles/1601/29/news043.html
    1. 秘密鍵ファイル（pvk）を（key）形式に変換
        ```cmd
        openssl pkcs12 -in (名前)Server.pfx -nocerts -nodes -out (名前)Server.pvk.key
        ```
    1. (名前)Server.pvk.key をテキストエディタで開き、`-----BEGIN PRIVATE KEY-----` より前のヘッダー部分を削除して (名前)Server.pvk.key.pem として保存する

1. csrに署名する
    ```cmd
    openssl x509 -req -CA (名前)Server.cer.pem -CAkey (名前)Server.pvk.key.pem -CAcreateserial -in (名前)Server.csr.pem -out (名前)Server.crt.pem -days 3650
    ```
    - (名前)Server.cer.srl と (名前)Server.crt.pem が作成される


-----------------------------------------

以下のページを参考にしました。

- https://knowledge.digicert.com/jp/tutorials/how-to-sign-using-signtool
- https://knowledge.digicert.com/jp/general-information/code-signing-timestamp-server