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 ブラウザから見たときにエラーが出なくなる。