macOSで警告の出ないローカル開発環境用のSSL証明書を作成する

# はじめに

ローカルの開発環境でHTTPSアクセスをするときに証明書の警告が出て精神衛生上よろしくありません。
`Keychain Access.app`を使って証明書を作成することで、警告を出ないようにすることができます。


# ルート証明書の作成

`Keychain Access.app`を起動します。

**Keychain Access** > **Certificate Assistant** > **Create a Certificate...**を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/54198c4b-1a32-2752-19fb-b753b1d45d7a.png)

**Certificate Assistant**ダイアログが表示されるので、以下のように入力・選択し、**Create**を押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/55edf784-04e0-b900-c125-a7d803724fea.png)

| Name [^1] | Identity Type | Certificate
|---|---|---|
| localhost | Self Signed Root | SSL Server |

[^1]: この「Name」はアクセスしたいドメイン名に適宜置き換えてください。

自己署名についての警告が出ますが、この証明書はローカルでのみ使用するためこのまま**Continue**を押して続けます。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/4c296210-4ea0-56e8-78f4-9b77e1f7bbeb.png)

作成が成功した旨のメッセージが表示されますので、**Done**を押して閉じます。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/a83e7e66-b5b2-803e-d5d5-b8887b6ed228.png)


# 作成したルート証明書を信用設定

「localhost」で検索して、今作成したルート証明書を表示します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/fe8ac214-5af7-d438-ae35-a83c178ae503.png)

下の「！」ボタンを押すか、ダブルクリックするとダイアログが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/56b78658-8387-73a4-0393-f92e255c5fb0.png)

**Secure Sockets Layer (SSL)**を「Always Trust」に変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/a0ce1c36-8278-3efc-bfe3-f92cd0c1d213.png)

ダイアログを閉じる際にパスワードの入力を求められます。ここには自分のmacOSのアカウントのパスワードを入力します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/b8f8cedc-9c0c-1786-5a85-a8a3f332e69c.png)

**Kind**が**private key**の秘密鍵を右クリックして**Export "localhost"...**からエクスポートします。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/a78bf1ce-2d4b-e763-cb8c-b9d40be4aec0.png)

秘密鍵を任意の場所に保存します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/d86407bc-423e-7faf-509b-a155bf896f38.png)

秘密鍵へのパスワード設定のダイアログが表示されます。ここはパスワードを空のまま**OK**を押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/41aa45ab-0201-7452-c444-e1960501fb86.png)

確認のダイアログが表示されるので、El Capitanの場合はここで再びOSのアカウントのパスワードを入力します。Sierraでは入力を求められないのでそのまま**Allow**を押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/7055/a86377f6-3490-e225-7330-66ab9aca56d4.png)

`Keychain Access.app`での作業は以上です。


# 鍵ファイルをPEM形式に変換

保存した秘密鍵を`openssl`コマンドでPEM形式に変換します。
ここでは`Keychain Access.app`から`localhost.p12`という名前で保存したこととします。

```shell-session
$ openssl pkcs12 -in localhost.p12 -out localhost.pem -nodes
```

パスワードの入力を求められますが、空のままEnterでよいです。

```shell-session
Enter Import Password:
MAC verified OK
```

証明書の保存用ディレクトリを作成します。

```shell-session
$ mkdir ~/.localhost-ssl
```

`localhost.pem`を`localhost.crt`と`localhost.key`に分離します。

`BEGIN CERTIFICATE`と`END CERTIFICATE`で囲まれた部分を`~/.localhost-ssl/localhost.crt`に保存します。

```text:localhost.crt
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
```

`BEGIN RSA PRIVATE KEY`と`END RSA PRIVATE KEY`で囲まれた部分を`~/.localhost-ssl/localhost.key`に保存します。

```text:localhost.key
-----BEGIN RSA PRIVATE KEY-----
...
...
...
-----END RSA PRIVATE KEY-----
```

秘密鍵の方はパーミッションを変更しておきます。

```shell-session
$ chmod 600 ~/.localhost-ssl/localhost.key
```

# おわりに

作成した鍵をNginxなどから参照するようにすることで、アクセス時に警告が出なくなります。
ただし、このままだとFirefoxからは警告が出るままなので要調査です。


# 参考

- [CertSimple | Never see localhost HTTPS warnings again](https://certsimple.com/blog/localhost-ssl-fix)