Web アプリケーションの開発時に、Web ブラウザから (localhost ではなく) 特定のドメイン名で Web サーバに対して HTTPS アクセスする必要が生じることがある。その場合、自己署名証明書を発行して設置するのが最も簡単である。
自己署名証明書を作成する
自己署名証明書は OpenSSL コマンドで簡単に作成できる。
以下は example.com とそのサブドメインのワイルドカード *.example.com の証明書を発行するコマンド例。
$ openssl req \
-x509 \
-newkey rsa:4096 \
-noenc \
-keyout example.com.key \
-subj "/CN=example.com (self-signed)" \
-addext "subjectAltName = DNS:example.com, DNS:*.example.com" \
-days 365 \
-out example.com.crt
秘密鍵ファイル (.key) と証明書ファイル (.crt) が作成されるので、これらを Web サーバに設置すればよい。
オプションの解説
より詳しくは man openssl-req を参照。
-
-x509- そもそも
openssl reqは証明書署名リクエスト (CSR) を作成するコマンドだが、-x509オプションを使用した場合は CSR ではなく自己署名した証明書が作成される
- そもそも
-
-newkey rsa:4096- 秘密鍵を指定するのではなく新規作成する
- 新規作成する秘密鍵は 4096 ビットの RSA 鍵とする
-
-noenc- 新規作成する秘密鍵ファイルは暗号化しない
-
-keyout example.com.key- 出力する秘密鍵ファイル名
-
-subj "/CN=example.com (self-signed)"- 証明書の CN (Common Name) を指定する
- 昔は CN にドメイン名を指定していたが、最近の Web ブラウザは SAN が指定されている場合は CN を見ないらしく「指定する文字列はなんでもいいのでは?」ということでこの例では
(self-signed)などと入れてみている
-
-addext "subjectAltName = DNS:example.com, DNS:*.example.com"- SAN (Subject Alternative Name) を指定する
- このオプションは OpenSSL 1.1.1 以降で使用可能で、それ以前の場合は別の方法で SAN を指定する必要がある
-
-days 365- 証明書の有効期限は 365 日とする
-
-out example.com.crt- 出力する証明書ファイル名
自己署名証明書を信頼する (macOS)
自己署名証明書は Web ブラウザから信頼されていないので当然のようにエラーが出る。何らかの方法で Web ブラウザまたは OS に対して「この証明書は信頼してもよい」と設定する必要がある。
macOS の場合、証明書をキーチェーンに追加した上で「SSL」「X.509 基本ポリシー」を信頼するように設定すれば Web ブラウザから見たときにエラーが出なくなる。
