ローカル開発用に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が返却される