【Docker】https-portalを使ってHTTPS化 & Let’s encryptの自動化

この記事ではhttps-portalを使ってHTTPサービスをHTTPS化する方法を解説しています。

https-portalとは

NginxとLet’s encryptを内包したDockerイメージで、HTTPで動作しているサービスを簡単にHTTPS化することが出来ます。証明書の取得や自動更新、HTTPS化の設定などをDockerコンテナを起動するだけで行うことが出来ます。詳しくは以下のGithubのページを見てみてください。

前提

  • https-portalを使用する上で、Docker(docker-composeも使える)環境が必要になります。
  • HTTPS化したサイトを外部に公開するにはドメインを取得していて、名前解決が可能な状態で、対象サーバの80・443番ポートが使用可能で外部に公開されている必要があります。

クイックスタート

以下のリンクの docker-compose.yml を元に設定をしていきます。

services: が抜けていたので追記しています。

version: '3'

services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    links:
      - wordpress
    restart: always
    environment:
      DOMAINS: 'wordpress.example.com -> http://wordpress:80'
      # STAGE: 'production' # Don't use production until staging works
      # FORCE_RENEW: 'true'
    volumes:
      - https-portal-data:/var/lib/https-portal

  wordpress:
    image: wordpress
    links:
      - db:mysql

  db:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: '<a secure password>'

volumes:
  https-portal-data:

上記を適宜設定して実行するとHTTPS化された状態のWordpressの環境が立ち上がります。

基本的に書き換える必要がある項目は https-portalenvironment です。

  • DOMAINS: 'wordpress.example.com -> http://wordpress:80'
    • ドメインとHTTPで動作しているバックエンドサーバを指定しています。この場合は、wordpress.example.com 宛のアクセスをDockerネットワークで接続されている、wordpressコンテナへHTTPS化してリバースプロキシするように設定されています。
  • # STAGE: 'production'
    • この行はコメントアウトされていますが、設定されていない場合のデフォルト値は staging となります。この場合はLet’s encryptのテスト証明書となり、証明書エラーが表示されます。この行のコメントを解除すると本番環境として動作し、証明書エラーは表示されなくなります。productionの場合は短期間に何度も証明書を取得することが出来ないため、検証はstagingで行い問題が無いようであればproductionに切り替えるようにします。
    • local、staging、production を指定することが出来ます。(詳細は後述)
  • # FORCE_RENEW: ‘true’
    • 通常は証明書の有効期限の30日前までは再署名しませんが、強制的に更新を行いたい場合はコメントを解除します。production で何度も更新を行うと証明書の取得すら出来なくなる場合があるため注意が必要です。

STAGEの設定

STAGEの設定をlocal、staging、productionで試してみます。docker-compose.yml自体はクイックスタートのものよりもシンプルにして、wordpress + db では無く、単純に nginx のみ動作させることにします。

STAGE: ‘local’

Let’s encryptでは無く、自己証明書が発行されます。ドメインが無くても /etc/hosts を編集して試すことが出来ます。テスト目的でとりあえずHTTPS化したい時に利用出来るかと思います。

以下はローカルのマシンで試しました。/etc/hosts を編集し、127.0.0.1 test.flan999.com を追記しました。

version: '3'
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    environment:
      DOMAINS: 'test.flan999.com -> http://nginx:80'
      STAGE: 'local'
      # FORCE_RENEW: 'true'
    volumes:
      - https-portal-data:/var/lib/https-portal

  nginx:
    image: nginx
    restart: always

volumes:
  https-portal-data:

docker-compose up -d を実行すると自己証明書を作成して立ち上がります。

STAGE: ‘local’ で立ち上げた場合

STAGE: ‘staging’

Let’s encryptのステージング環境にて証明書を発行します。こちらも自己証明書と同様に証明書エラーが表示されますが、本番環境と同様の流れで証明書を発行出来ます。ステージング環境より本番環境の方がレート制限が厳しいため、本番環境へ適用する前に設定に問題が無いか確認を出来ます。本番環境で証明書を取得する前にステージングで証明書を取得して動作に問題が無いかを確認することをおすすめします。

version: '3'
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    environment:
      DOMAINS: 'test.flan999.com -> http://nginx:80'
      STAGE: 'staging'
      # FORCE_RENEW: 'true'
    volumes:
      - https-portal-data:/var/lib/https-portal

  nginx:
    image: nginx
    restart: always

volumes:
  https-portal-data:

docker-compose up -d を実行するとステージング環境で証明書を発行して立ち上がります。

STAGE: ‘staging’ で立ち上げた場合

STAGE: ‘production’

Let’s encryptの本番環境に証明書を発行します。最終的にこちらの証明書を用いてWebサーバが外部に公開されることとなります。

version: '3'
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    environment:
      DOMAINS: 'test.flan999.com -> http://nginx:80'
      STAGE: 'production'
      # FORCE_RENEW: 'true'
    volumes:
      - https-portal-data:/var/lib/https-portal

  nginx:
    image: nginx
    restart: always

volumes:
  https-portal-data:

STAGEを書き換え、docker-compose up -d --force-recreate を実行するとステージング環境で証明書を発行して立ち上がります。

STAGE: ‘production’ で立ち上げた場合

コメント

タイトルとURLをコピーしました