コマンドで Web サービス用の 自己署名証明書 を発行する手順

# はじめに
AD CS などの認証局を使わずに、コマンドで ルート証明書 と サーバー証明書 を作成する手順です。

テスト目的で、簡単に 自己署名証明書（いわゆる オレオレ証明書）を作成できるので、便利です。

Web サービスで利用するためには、作成した２種類の証明書をそれぞれ配備する必要があります。
- ルート証明書 = クライアント PC に配置する
- サーバー証明書 = IIS などの Web サーバーに配置する

証明書を作成したあとに、各ホストに配備するために、一旦 エクスポートして、ローカルコンピューター のストアにインポートするまでの一連の手順を用意してみました。

この手順で作成した証明書を使って、以下の記事で紹介している VPN (SSTP) や IIS の接続で問題なく利用できることも確認済みです。

https://qiita.com/carol0226/items/9e4efc903a8802a60cfd

以下の記事は、公的証明書 をバインドしていますが、自己署名証明書 でも利用できるのです。

https://qiita.com/carol0226/items/97488c72035214e7868f

# 手順

## 1. ルート証明書 の作成
以下のコマンドで、ルート証明書 を作成します。
**Subject** 欄の "SstpRootCert" は、任意の名前に変更しても大丈夫です。
**NotAfter** の **AddMonths** の (24) は、証明書の有効期限を 24ヵ月後に設定しています。
ここを可変させることで、有効期限を調整できます。

あとは、PowerShell（管理者）ウィンドウを開いて、**貼り付け＆実行** してください。

**貼り付けるコマンド**
~~~
$params = @{
    Type = 'Custom'
    Subject = 'CN=SstpRootCert'
    KeySpec = 'Signature'
    KeyExportPolicy = 'Exportable'
    KeyUsage = 'CertSign'
    KeyUsageProperty = 'Sign'
    KeyLength = 2048
    HashAlgorithm = 'sha256'
    NotAfter = (Get-Date).AddMonths(24)
    CertStoreLocation = 'Cert:\CurrentUser\My'
}
$cert = New-SelfSignedCertificate @params
$cert
~~~

**実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e4d1ca34-1e76-27e6-8411-353e5647d0dd.png)

:::note warn
**注意**
上記のウィンドウは、閉じずに 次の章へ進んでください。
変数（$cert）に保存された値を 次のコマンドで引き継いで利用しているためです。
:::

## 2. サーバー証明書 の作成
以下のコマンドで、サーバー証明書 を作成します。
**Subject** 欄 と **DnsName** 欄 の "vpnnogu.japaneast.cloudapp.azure.com" は、任意の名前に変更してください。サーバーへ接続する際の **URL** などを指定してください。
**NotAfter** の **AddMonths** の (24) は、証明書の有効期限を 24ヵ月後に設定しています。
ここを可変させることで、有効期限を調整できます。

**貼り付けるコマンド**
~~~
   $params = @{
       Type = 'Custom'
       Subject = 'CN=vpnnogu.japaneast.cloudapp.azure.com'
       DnsName = 'vpnnogu.japaneast.cloudapp.azure.com'
       KeySpec = 'Signature'
       KeyExportPolicy = 'Exportable'
       KeyLength = 2048
       HashAlgorithm = 'sha256'
       NotAfter = (Get-Date).AddMonths(24)
       CertStoreLocation = 'Cert:\CurrentUser\My'
       Signer = $cert
       TextExtension = @(
        '2.5.29.37={text}1.3.6.1.5.5.7.3.1')
   }
   New-SelfSignedCertificate @params
~~~

**実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b74899d2-c54a-425e-b66a-9ade03e1a8fa.png)

## 3. 作成された証明書の確認
この作業で、作成された証明書を目視確認します。

0. スタートボタンを右クリックして、**ファイル名を指定して実行** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6147e85a-2902-edbf-97ef-6eb5896f174b.png)
　<br>
0. **certmgr.msc** と入力して、**OK** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/88ddc756-cfbe-ece9-5fc2-6b10b09c26cb.png)
　<br>
0. 下図のとおり、**個人** の証明書ストア を開くと、作成された証明書を確認できます。
- 緑色 ＝ ルート証明書
- 水色 ＝ サーバー証明書

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ae024ca0-a4d8-07b9-84cb-87a9db8b201c.png)

:::note info
作成された証明書を、ログオン中の **ユーザーのみ** で利用する場合は、これで **完了** です。
:::

:::note warn
サーバーの機能などで利用する場合は、ローカルコンピューター のストアに配置されている必要があるため、次章以降の手順で 証明書の場所を移動します。
:::

## 4. サーバー証明書 の エクスポート
作成された証明書は、ローカルユーザーのストアに存在しているため、ローカルコンピューターのストアや、他のサーバーで利用するために、必ず 一旦 エクスポートが必要です。

0. 作成された サーバー証明書 を右クリックして **すべてのタスク** から **エクスポート** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4780efd6-9d40-098c-5cbb-bd1da83fc640.png)
　<br>
0. 以下の画面では、そのまま **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/5771d062-a9a5-278f-21e4-3388bb211139.png)
　<br>
0. 以下の画面では、必ず **"はい、秘密キーをエクスポートします"** を選択して **次へ** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/bccc2463-fe53-57d1-0123-7acb0881839a.png)
　<br>
0. 以下の画面では、そのまま **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/19238ecf-d2b3-75b2-88cf-d0377c0b7fe0.png)
　<br>
0. パスワード欄にチェックを入れて、パスワードを入力します。そのあと **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/906d2363-fa58-780e-7d70-9044da38582b.png)
　<br>
0. ① **"参照"** ボタンを押して、任意のファイル名を指定して、② のように表示されたことを確認したら、③ **"次へ"** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3418030b-45f4-e72c-d70c-3315fe0d8edb.png)
① を押した際に表示される画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ee9d8b41-54c6-d31e-6ff0-f64757d2300a.png)
　<br>
0. 以下の画面が表示されれば **OK** です。**完了** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/5ec8f049-523d-58cc-20fe-e48e0ec5b924.png)
　<br>
0. 以下の画面が表示されたら **OK** を押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8307042b-b5ec-6101-f1d6-b33b62d584a8.png)

## 5. サーバー証明書を ローカルコンピューター へ インポート する
前章でエクスポートしたファイルを選択して、ローカルコンピューターへインポートします。
別の Web サーバー等にインポートする場合は、エクスポートした pfx ファイルを コピーしてから コピー先のコンピューター上で実行します。

0. pfx ファイルを右クリックして **PFX のインストール** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/79eb7878-57b6-9e3e-5dd1-e025a1842242.png)
　<br>
0. 以下の画面では、必ず **ローカルコンピューター** を選択して **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e63c9a7f-fcd5-ba9d-5ed2-ea306f765c28.png)
　<br>
0. 以下の画面では、そのまま **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/173e69d1-37fd-2485-a506-a707516d1087.png)
　<br>
0. 以下の画面では、エクスポート時に指定した **パスワード** を入力して **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/186d4004-9b7c-f047-a46a-bbf83928376b.png)
　<br>
0. 以下の画面では、**"証明書の種類に基づいて、自動的に証明書ストアを選択する"** が選択されている事を確認して **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1defb9b5-f415-011e-9ce8-7f4a54722b6e.png)
　<br>
0. 以下の画面がでれば **OK** です。**完了** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3fcac245-8286-82f2-a710-4c9d2809a9f2.png)
　<br>
0. 以下の画面が表示されたら **OK** を押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4b3fed87-e374-f137-f504-26087d7a70db.png)

## 6. 結果確認
0. スタートボタンを右クリックして、**ファイル名を指定して実行** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6147e85a-2902-edbf-97ef-6eb5896f174b.png)
　<br>
0. **certlm.msc** と入力して、**OK** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6baa0443-b476-b5dd-6358-a34f50ff1193.png)
　<br>
0. 以下の通り、**信頼されたルート証明機関** の証明書ストアを開き、インポートした **ルート証明書** があることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f2117108-6380-b42a-775c-41c6c09ae9e2.png)
　<br>
0. 以下の通り、**個人** の証明書ストアを開き、インポートした **サーバー証明書** があることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2ac5195c-0444-0430-cc2f-27acc8fc5195.png)
　<br>
0. サーバー証明書 をダブルクリックして **証明のパス** タブを開きます。下図のように ルート証明書 と サーバー証明書 が 階層構造で表示され、**この証明書は問題ありません** になっていることを確認します。**OK** を押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cde6ac5d-d301-eda8-d1cb-d2211a1bcde2.png)

以上の作業で、テスト用に作成した 自己署名証明書を ローカルコンピュータ のストアに保存できました。

このあと、Web サービス側で Web サイトと サーバー証明書とをバインドを行うことで、サーバー証明書 が実際に機能するようになります。

## 7. クライアントへの配布用に ルート証明書 をエクスポートする

0. 信頼されたルート証明機関 の証明書ストアにある **ルート証明書** を右クリックして **すべてのタスク** から **エクスポート** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b267c525-286d-c958-30b9-9c9aef2a4e63.png)
　<br>
0. 以下の画面では **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/eb4ca6b7-5036-822e-c0b5-704e7456932c.png)
　<br>
0. 以下の画面では **Basse 64 encoded X.509 (.CER)** を選択して **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/db91fcbe-bc03-27ab-7d76-c9b2a31b39b6.png)
　<br>
0. ① **"参照"** ボタンを押して、任意のファイル名を指定して、② のように表示されたことを確認したら、③ **"次へ"** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/930076a3-dc1b-053a-a4f2-8a2d2f9750b9.png)
① を押した際に表示される画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7db13f50-70ea-6f46-b259-2069b5ab3d87.png)
　<br>
0. 以下の画面がでれば **OK** です。**完了** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6e31c194-c1f5-0263-8cd8-da9713400271.png)
　<br>
0. 以下の画面が表示されたら **OK** を押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8307042b-b5ec-6101-f1d6-b33b62d584a8.png)
　<br>
0. 以下の通り、エクスポートされたファイルを クライアント PC へコピーして 利用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/893a67b5-bac7-ad8d-a649-78ab2f1d266a.png)

## 8. クライアントへ ルート証明書 をインポートする

0. クライアントへコピーされた ルート証明書 をダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6033071b-4819-8eab-c8d1-d70f61d48942.png)
　<br>
0. 以下の画面で **証明書のインストール** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/036cc3e0-ca28-95d5-2ff8-0f29d0dde5f7.png)
　<br>
0. **保存場所** は **ローカル コンピューター** を選択して **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9670af84-d24b-4789-ac80-28f7ada6835e.png)
　<br>
0. **参照** ボタンを押したあと、**信頼されたルート証明機関** を選択して、最後に **次へ** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f1f29ed7-3505-936c-a699-06b371b7612d.png)
　<br>
0. 以下の画面が表示されたら **完了** を押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/654dd7f8-6239-c512-b935-e82a5e75f445.png)
　<br>
0. **ファイル名を指定して実行** から、**Certlm.msc** を起動し、**信頼されたルート証明機関** の 証明書ストア上に、**ルート証明書** がインポートされたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/38c3733e-1681-2e8d-56c7-3cf4d4a9fed6.png)

以上で、クライアントへ ルート証明書 のインポートが完了しました。

ルート証明書がインポートされた PC から、サーバー証明書 のある Web サービス へアクセスし、正常に サーバーにアクセスできることを確認してください。

# 参考
この記事の作成にあたっては、以下の公開情報を参考にしています。
公開情報の内容は、ルート証明書 と クライアント証明書 を作成する手順になっていますが、これを元に サーバー証明書 を作成する内容に改変していますが、違いは　以下の場所だけです。

**サーバー証明書**
TextExtension = @(
        '2.5.29.37={text}1.3.6.1.5.5.7.3.1')

**クライアント証明書**
TextExtension = @(
        '2.5.29.37={text}1.3.6.1.5.5.7.3.2')

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-certificates-point-to-site?wt.mc_id=mvp_407731