Archive: 2020

タグ・月別アーカイブ

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 用の環境もついでに作りました。こちら