Okada Hiroshi の blog

typo が多いです

ローカルで開発中のコンテンツも初期の段階から https (ssl) で配信する (その1)

はてなブックマーク などごく一部のサービスを除いて多くの Web サービスが https で配信されるようになりました。 これはセキュリティ的には非常に良いことなのですが、開発している時には不便な事もあります。

例えば

  • OAuth 2.0 のコールバック URL は大抵の場合 localhost 以外だと https である必要がる。けれども、開発中にも隣においてある PC やスマホからアスセスした。
  • Web ブラウザから加速度センサー等のセンサーを読み出すためには https でないと動作しない。 Sensors For The Web!  |  Web  |  Google Developers
  • html 文書中で間違えて http で供給されるコンテンツを参照していても (エラーが出ないので) 気が付かず https 環境にアップロードして初めて気がつく。

などのです。

これを防ぐために開発の初期の段階から ssl 化しておく事が望ましいです。

https で配信するためには、ホスト名とそれに対応した ssl 証明書が必要です。例えば僕の自宅 LAN の場合 192.168.100.* というアドレスが DHCP dで配布されますので、DNS サーバーにこれらのホストを登録して、対応する ssl 証明書を取得すれば、ローカルで開発中のコンテンツも ssl で配信できます。

具体的には僕の所有しているドメイン toycode.com のサブドメイン local.toycode.com というのを作って、 a192-168-100-2.local.toycode.com なら 192.168.100.2、 a192-168-100-3.local.toycode.com なら 192.168.100.3 というアドレスが引けるようにして、さらに *.local.toycode.com のワイルドカード証明書を取得することにより ssl 化を行うことにしました。

今回は Google Compute Engine (GCE) の無料枠の f1-micro インスタンス上に DNS サーバーを立てて、let's encrypt でワイルドカード証明書を取得することにより、ほとんど追加の費用なしで上記の事を実現できましたので、手順を説明します。

この方法はオレオレ証明書を使う方法やトンネリングを使う方法に比べてクライアント側の設定がいらないのが利点だと思います。

1. GCE のインスタンスを作成しました。

GCE の無料枠の f1-micro インスタンスの立て方はネットワーク上に山ほど記事があるので、割愛します。今回は DNS サーバーとして利用しますので、固定IP を取得します。固定IPはインスタンスに割当ないと課金されるので確実にインスタンスに割り当てる必要があります。

ブートディスクは Ubuntu 18.04 LTS を使用しました。名前は nc-local としました。今回 IP アドレスは 35.199.181.64 でした。

f:id:OkadaHiroshi:20190116145210p:plain

2. ファイアーウォールのルールを作成してポート 53 を開けました。

ファイアーウォールのルールを作成します。名前とか説明は何でも良いのですが、注意点としては UDP 53、TCP 53 の両方を開けるルールにすることです。 ターゲットタグの名前は覚えやすいように dns-server にしました。

f:id:OkadaHiroshi:20190116150214p:plain

指定したターゲットタグを VM インスタンス nc-local に割り当てました。 スクリーンショットでは http と https のポートも開いていますが今回の目的には不要です。

f:id:OkadaHiroshi:20190116150450p:plain

3. toycode.com の DNS サーバーから local.toycode.com のサブドメインの権限を移譲しました。

toycode.com の DNS サーバーは amazon の route 53 を使っています。local.toycode.com の権限を移譲させるために、aws の Route 53 Management Console を使って次の2つのレコード を追加しました。

f:id:OkadaHiroshi:20190116151616p:plain

他のサービスを使っていてもほぼ同様の事ができると思います。

ドメインのメインのネームサーバーは2つ以上必要ですが、サブドメインのネームサーバーは(冗長性を考えなければ)1つで OK です。