WebRTCのページを作成しようとしたけどChromeだとSSL化が必須で、手軽にローカルのDocker上にあるWebサーバをSSL化出来ないかと思って、 steveltn/https-portalを使用してリバースプロキシをDocker上に構築し、SSL化を行った時のメモです

https-portalの特徴

  • コンテナ生成時に自動でLet’s Encryptを使用してドメイン認証証明書を生成し、リバースプロキシまでの経路の暗号化をしてくれる
  • 既存のWeb側コンテナはドメイン設定(Nginxだと server_nameとか)をいじるだけで特に何もしなくてよい
  • STAGElocalを指定するとローカル環境でも使用出来る

サンプルコード

説明書を読まないタイプの方向けに、今回作成した サンプルコードを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に飛ばしてくれるようです