はじめに

nginx on docker(docker-compose) を FiloSottile/mkcert で生成した自己生成証明書(オレオレ証明書)で HTTPS(SSL)化する方法。

証明書はホストマシン上で作成。

TL;DR

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. 証明書作成まで
      1. セットアップ
      2. 証明書作成
    2. Docker 設定変更
      1. 証明書のマウント
    3. nginx 設定変更
    4. 動作確認
  5. まとめ
  6. その他・メモ
  7. 参考文献
    1. 記事と関係あり
    2. 記事と関係なし

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ホストマシン
$ cat /etc/os-release
PRETTY_NAME="Amazon Linux 2"

$ docker --version
Docker version 18.09.9-ce, build 039a7df

$ docker-compose --version
docker-compose version 1.24.1, build 4667896b

# コンテナ
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"

$ nginx -v
nginx version: nginx/1.17.9

詳細

証明書作成まで

セットアップ

FiloSottile/mkcert の Installation に従って設定。

nss-tools

nss-tools をインストール

参考: Linux - Installation

1
$ yum install -y nss-tools
Homebrew on Linux

homebrew をインストール(mkcertbrew install でインストールするので)

参考: Homebrew on Linux — Homebrew Documentation

1
2
3
4
5
# インストール
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
...
==> Installation successful!
...

設定追加など

1
2
3
4
$ test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
$ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
$ test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
$ echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile

動作確認

1
2
3
$ brew install hello
==> Installing dependencies for hello: patchelf, m4, gmp, mpfr, libmpc, isl@0.18, zlib and gcc
...
mkcert

mkcert をインストール

1
2
3
4
5
6
7
# ホスト
$ brew install mkcert
...
🍺 /home/linuxbrew/.linuxbrew/Cellar/mkcert/1.4.1: 7 files, 4.8MB

$ mkcert --version
v1.4.1

証明書作成

すべてホスト上で実行。

生成されるファイルについている +1 というのは、「localhost 以外にもう一つ(127.0.0.1)有効な名前があるよ」という意味。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ mkcert -install
Using the local CA at "/home/xxxx/.local/share/mkcert"
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox and/or Chrome/Chromium trust store (requires browser restart)! 🦊

$ mkcert localhost 127.0.0.1
Using the local CA at "/home/xxxx/.local/share/mkcert"

Created a new certificate valid for the following names 📜
- "localhost"
- "127.0.0.1"

The certificate is at "./localhost+1.pem" and the key at "./localhost+1-key.pem"

Docker 設定変更

証明書のマウント

今回はホストの ./cert をコンテナの /etc/nginx/ssl/cert にマウントするので、ディレクトリ作ってファイルを移動しておく。

1
2
3
$ mkdir cert
$ mv localhost+1.pem cert/localhost.pem
$ mv localhost+1-key.pem cert/localhost-key.pem

docker-compose.yml を変更

1
2
3
4
5
6
7
8
9
10
11
 version: '3'

services:
nginx:
...
ports:
- - 1234:80
+ - 1234:443
volumes:
...
+ - ./cert:/etc/nginx/ssl/cert:cached

nginx 設定変更

nginx-default.conf(/etc/nginx/conf.d/default.conf に配置されるファイル) を変更

1
2
3
4
5
6
7
8
9
 server {
server_name 127.0.0.1;
- listen 80;
+ listen 443 ssl;

+ ssl_certificate /etc/nginx/ssl/cert/localhost.pem;
+ ssl_certificate_key /etc/nginx/ssl/cert/localhost-key.pem;
...
}

動作確認

コンテナを再作成して https でアクセスすると、証明書について警告されるので「詳細設定」→「xxxx にアクセスする」でページが表示されれば OK。

まとめ

その他・メモ

Nuxt with Nginx on Docker(Docker-Compose) という構成で、Nginx 箇所で SSL 化するようにしたが、色々と調べた感じだと他レイヤ(他箇所)で SSL 化する方法もあるっぽい。

なお、見ただけで試してないのでそれぞれの優劣(メリット/デメリット)は分からない。以下、参考文献を参照。

参考文献

色々と見て回ったので列挙しておくが、分類は適当(精査しきれてない)なのであしからず。

記事と関係あり

mkcert

nginx

記事と関係なし

docker-compose: https-portal

Nuxt

axios

関連記事