ローカル開発用にDocker Comnposeで動かしているNginxをHTTPS対応する必要が出てきたので、自作のSSL証明書を使って対応することにした。
opensslで秘密鍵、署名リクエスト、SSL証明書を作成
sslというフォルダを作成する
mkdir ssl
cd ssl
秘密鍵(KEY)を作成する
暗号にはRSA 2048ビットを使用する。
openssl genrsa 2048 > server.key
署名リクエスト(CSR)を生成する
SSLサーバ証明書発行に必要なテキストデータで、認証局はこのテキストデータを元に内容を精査してSSL証明書を発行するらしい。(今回は自作するので適当でOK)
openssl req -new -key server.key > server.csr
> Country Name (2 letter code) []:81
> State or Province Name (full name) []:tokyo
> Locality Name (eg, city) []:tokyo
> Organization Name (eg, company) []:none
> Organizational Unit Name (eg, section) []:none
> Common Name (eg, fully qualified host name) []:rinoguchi.com
> Email Address []:hoge@gmail.com
> A challenge password []:****
SSL証明書(CRT)を生成する
x509は公開鍵基盤の規格の名前らしい。100年の設定でSSL証明書を作成する。
openssl x509 -days 36500 -req -signkey server.key < server.csr > server.crt
Dockerの設定
Dockerコンテナの443ポートを公開する
コンテナ側の80(http)と443(https)ポートを公開し、ホスト側の同一ポート番号と紐づける。
version: '3'
services:
mynginx:
build: .
ports:
- "80:80"
- "443:443"
SSL関係のファイルをDockerイメージに追加する
Dockerfileにて、作成したSSL関係のファイルを/etc/nginx/ssl
に追加する設定を行う。
FROM nginx:latest
ADD default.conf /etc/nginx/conf.d
ADD ssl /etc/nginx/ssl
Nginxの設定
default.confに以下のように設定を行う。
server {
listen 80;
server_name rinoguchi.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name rinoguchi.com;
ssl_certificate /etc/nginx/ssl/server.crt; #SSL証明書
ssl_certificate_key /etc/nginx/ssl/server.key; #秘密鍵
location / {
proxy_pass http://host.docker.internal:8080/;
proxy_redirect default;
}
}
- httpのリクエストは、httpsに301リダイレクト(Moved Permanently)する。
- SSL証明書と秘密鍵を指定する
動作確認
以下のコマンドで起動する。
docker-compose up --build
以下のように問題なく動作することが確認できた。
-
http://rinoguchi.com/
- ->
https://rinoguchi.com/
に301 Moved Permanently
される
- ->
-
https://rinoguchi.com
- ->
200 response
が返却される
- ->