WebRTCのページを作成しようとしたけどChromeだとSSL化が必須で、手軽にローカルのDocker上にあるWebサーバをSSL化出来ないかと思って、 steveltn/https-portalを使用してリバースプロキシをDocker上に構築し、SSL化を行った時のメモです
https-portalの特徴
- コンテナ生成時に自動でLet’s Encryptを使用してドメイン認証証明書を生成し、リバースプロキシまでの経路の暗号化をしてくれる
- 既存のWeb側コンテナはドメイン設定(Nginxだと
server_name
とか)をいじるだけで特に何もしなくてよい
STAGE
に local
を指定するとローカル環境でも使用出来る
サンプルコード
説明書を読まないタイプの方向けに、今回作成した サンプルコードをGithubにそのままアップしています。どうぞご利用下さい
docker-compose.yml
web
がSSL化したいプロダクトのWebサーバで、 https-portal
が今回構築するリバースプロキシです
DOMAINS
の行にある、 web.local
と、 admin.web.local
がSSL化する対象のドメインです。 DOMAINS
には、カンマ区切りで複数ドメイン記述する事が出来て、そして起動時に全てのドメインのSSL証明書を作成してくれます
environment
に、 WEBSOCKET: "true"
を追加するだけで、WebSocketに対応出来たりします
- その他にもいろいろな機能がREADMEにのっているので、必要に応じて参照して下さい
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| version: '3.7'
services:
web: container_name: web hostname: web image: nginx:alpine working_dir: /web volumes: - ./web:/web - ./default.conf:/etc/nginx/conf.d/default.conf
https-portal: image: steveltn/https-portal:1 ports: - 80:80 - 443:443 restart: always environment: DOMAINS: 'web.local -> http://web:80, admin.web.local -> http://web:80' STAGE: local volumes: - ./ssl-certs:/var/lib/https-portal depends_on: - web
|
Nginx設定: default.conf
nginx設定の基本的なお作法についてはここでは割愛します。 server_name
が発行したドメインと同じ設定があるか確認だけしておきます
1 2 3
| $ cat default.conf | grep server_name server_name web.local; server_name admin.web.local;
|
実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $ docker-compose up -d Creating network "https_default" with the default driver Pulling https-portal (steveltn/https-portal:1)... 1: Pulling from steveltn/https-portal b8f262c62ec6: Pull complete a6639d774c21: Pull complete 22a7aa8442bf: Pull complete 08241c125e6c: Extracting [==================================================>] 1.961MB/1.961MB 08241c125e6c: Pull complete b05d20f02054: Pull complete decc76d2cfbc: Pull complete 769a276dcb6f: Pull complete 3b867645ffc7: Pull complete 5c5efe3f6355: Pull complete Digest: sha256:d2d8a7f90e53b1acc27a670652e95c4870f0c5f5d72b92d483a900ad132fd40a Status: Downloaded newer image for steveltn/https-portal:1 Creating web ... done Creating https_https-portal_1 ... done
|
ログはこんな感じです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| $ docker-compose logs -f https-portal Attaching to https_https-portal_1 https-portal_1 | [s6-init] making user provided files available at /var/run/s6/etc...exited 0. https-portal_1 | [s6-init] ensuring user provided files have correct perms...exited 0. https-portal_1 | [fix-attrs.d] applying ownership & permissions fixes... https-portal_1 | [fix-attrs.d] done. https-portal_1 | [cont-init.d] executing container initialization scripts... https-portal_1 | [cont-init.d] 00-welcome: executing... https-portal_1 | https-portal_1 | ======================================== https-portal_1 | HTTPS-PORTAL v1.10.1 https-portal_1 | ======================================== https-portal_1 | https-portal_1 | [cont-init.d] 00-welcome: exited 0. https-portal_1 | [cont-init.d] 10-persist-env: executing... https-portal_1 | [cont-init.d] 10-persist-env: exited 0. https-portal_1 | [cont-init.d] 20-setup: executing... https-portal_1 | Generating DH parameters, 2048 bit long safe prime, generator 2 https-portal_1 | This is going to take a long time https-portal_1 | .........................................................................++*++*++*++* https-portal_1 | Generating RSA private key, 4096 bit long modulus (2 primes) https-portal_1 | .........................................................++++ https-portal_1 | .........................................................................................++++ https-portal_1 | e is 65537 (0x010001) https-portal_1 | 2020/04/18 14:04:18 [notice] 247#247: signal process started https-portal_1 | Generating RSA private key, 2048 bit long modulus (2 primes) https-portal_1 | ...........................................+++++ https-portal_1 | .............+++++ https-portal_1 | e is 65537 (0x010001) https-portal_1 | Self-signing test certificate for web.local https-portal_1 | RSA key ok https-portal_1 | Signature ok https-portal_1 | subject=CN = web.local https-portal_1 | Getting Private key https-portal_1 | 2020/04/18 14:04:18 [notice] 259#259: signal process started https-portal_1 | Signed key for web.local https-portal_1 | 2020/04/18 14:04:18 [notice] 260#260: signal process started https-portal_1 | [cont-init.d] 20-setup: exited 0. https-portal_1 | [cont-init.d] 30-set-docker-gen-status: executing... https-portal_1 | [cont-init.d] 30-set-docker-gen-status: exited 0. https-portal_1 | [cont-init.d] done. https-portal_1 | [services.d] starting services https-portal_1 | [services.d] done.
|
確認
/etc/hosts
等で名前解決してブラウザでアクセスして、証明書が有効になっているか確認します
1 2 3
| $ tail /etc/hosts 127.0.0.1 web.local 127.0.0.1 admin.web.local
|
ちなみにデフォルトでは、 http
でアクセスした場合は勝手に https
に飛ばしてくれるようです