Let's encrypt + nginx で momo 環境を https 化した話
chrome では WebXR Device API は https でないと有効にならないようなので、さっくりと試してみた。
対象は WebRTC Native Client Momo の提供する、test モードでの http, WebSocket です。
作業内容としては、証明書を取得する+nginxでリバプロする、その二点だけです。
証明書の取得
みんな大好き Let's encrypt です。
いやもう大好きです。期限が短いから自動更新せざるを得ないし、自動更新作ってしまえば運用楽だし。無料だし。
certbot あたりが有名どころですが、lego を使いました。
環境は閉じている方が楽なので Raspber Pi Zero で動作させます。
そのため Mac からクロスコンパイルします。
$ git clone https://github.com/go-acme/lego.git
$ cd lego
$ export GOOS=linux
$ export GOARCH=arm
$ export GOARM=6
$ make build
strip するのが面倒なので、予め strip しておきましょう。
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ clean:
build: clean
@echo Version: $(VERSION)
- go build -v -ldflags '-X "main.version=${VERSION}"' -o ${BIN_OUTPUT} ${MAIN_DIRECTORY}
+ go build -v -ldflags '-s -w -X "main.version=${VERSION}"' -o ${BIN_OUTPUT} ${MAIN_DIRECTORY}
image:
@echo Version: $(VERSION)
今回は DNS サーバーは AWS/Route53 を使いました。
クラウド破産しないように、Route53 用の IAM を作成しておきましょう。
export AWS_ACCESS_KEY_ID=AXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXX
export AWS_HOSTED_ZONE_ID=XXXXX
export AWS_REGION=us-east-1
# 初期化
./lego --accept-tos --path=./letsencrypt --email="mail@address" --dns="route53" --domains="*.foobar.com" run
# 更新
./lego --accept-tos --path=./letsencrypt --email="mail@address" --dns="route53" --domains="*.foobar.com" renew --days 30
実行に成功したら、上の例では ./letsencrypt/certificates/ 以下に証明書が保存されています。
一般的には cron, CronJob で実行したりとか、コンテナの中に入れたりとか、renew したら Message 投げるとかすればいいんじゃないですかね。
今回はロボ用なのであまり考えません。
nginx の設定
みんな大好きかもしれない nginx でのリーバスプロキシです。wss も対応していてよかった。
/etc/nginx/nginx.conf
events {
worker_connections 768;
}
http {
upstream momo {
server localhost:8000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443;
server_name xxx.foobar.com;
ssl on;
ssl_certificate /xxx/letsencrypt/certificates/xxx.crt;
ssl_certificate_key /xxx/letsencrypt/certificates/xxx.key;
access_log /dev/null;
error_log /dev/null;
location /ws {
proxy_pass http://momo;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
location / {
proxy_pass http://momo;
}
}
}
上で取得した証明書を使います。server_name に対応する Route53 のエントリは手動か自動かで作っておきます。
おわりに
無事 Raspberry pi zero 上に https でアクセスできるようになりました!
lego repository にある Dockerfile を少々改変し、QNAP/docker-compose 用の環境もついでに作りました。こちら