DockerとPHP Laravelを使用し環境構築を行った際、
$ docker-compose up -d
でコンテナを立ち上げたあと、
ローカルサイトにhttpsアクセスすると証明書エラーが出てアクセスができない…
SSLサーバ証明書発行したはずなんだけど…と思ってたら、
自己証明書は、基本的にブラウザに信頼されないため、信頼する証明書として手動で追加する必要がある
とのこと。知らんかった。
ということで、
1. SSL証明書を発行する手順
2. macOSで信頼する証明書として追加する手順
の備忘録。
発生したエラー
参考までに、発生したエラー
この接続ではプライバシーが保護されません
NET::ERR_CERT_INVALID
1. SSL証明書を発行する
#nginxコンテナに入る
$ docker-compose exec nginx sh
#apkアップデートとOpenSSLのパッケージのインストール
$ apk add --update openssl
#server.keyという名前で 2048bit の秘密鍵を作成
$ openssl genrsa 2048 > server.key
#秘密鍵から署名要求(server.csr)を作成
$ openssl req -new -key server.key > server.csr
C=JP/ST=Tokyo/L=minato-ku/O=Example/OU=Web/CN=Exampledomain
#署名要求を秘密鍵で署名してサーバ証明書(server.crt)を作成
$ openssl x509 -days 3650 -req -signkey ./server.key -in server.csr -out ./server.crt
基本的なSSL証明書の発行は以上でOK。
なんかChromeの仕様変更により、ドメイン名のチェックをCommon Name(通称CN)ではなく
Subject Alternative Names(通称SAN)を参照するようになったという記事を見つけたため、
もしSubject Alternative Namesを含んだ自己署名サーバ証明書を作成する場合は以下。
#SANの設定値を定義するtxtファイルを用意(ファイル名は任意)
$ touch san.txt
subjectAltName = DNS:Exampledomain, IP:127.0.0.1
SANの定義ファイルを用意したら、秘密鍵・証明要求を作成するところまでは先述した手順と同じ。
サーバ証明書を作成する際に-extfile
オプションでSANの定義ファイルを読み込ませる。
#用意した定義ファイルを読み込ませてサーバ証明書を作成
$ openssl x509 -days 3650 -req -extfile san.txt -signkey server.key < server.csr > server.crt
#作成したサーバ証明書の内容を確認する
$ openssl x509 -in server.crt -text -noout
Certificate:
…
Subject: C = JP, ST = Tokyo, L = minato-ku, O = Example, OU = Web, CN = Exampledomain
Subject Public Key Info:
…
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:Exampledomain, IP Address:127.0.0.1
サーバ証明書の内容を確認してCommon NameとSubject Alternative Namesが出力されていればOK。
2. 作成したサーバ証明書を信頼する証明書として追加する手順[macOS]
1.で作成したサーバ証明書(server.crt)を 信頼する証明書として設定すれば、 HTTPS の通信ができるようになる。
下記の手順で設定します。詳しくはこちらの記事を参照。
- キーチェーンアクセス.appを開く
- 作成したserver.crtをダブルクリックで開く
- 証明書の詳細画面で「信頼」を開く
- 「この証明書を使用するとき」項目を常に信頼に変更
以上の手順を踏んでローカルサイトにアクセスすると、入れるようになった…!!!
手順的にはさほど難しくないけど、ど素人からすると解決まで長い道のりだった( ; ; )