Let's EncryptとARRのリバースプロキシで常時HTTPS化完了

  • 投稿日:
  • by
  • カテゴリ:
プロバイダから割り当てられているグローバルIPアドレスをいくつかの用途で外部から使っていて、その1つがこのブログなんですけど、それ以外にも仕事の関係でHTTPS通信を受け入れるように設定してました。
今までは、ブログは普通にHTTPのみで、仕事はHTTPSのみでと完全にすみ分けてたんだけど、ブログなんかも常時HTTPSが求められるようになってきたこともあって、信頼できないサイト呼ばわりされるのもいやなんで、Let's Encryptを使ってブログを常時HTTPS化することにしたという話。
想定している環境はこんな感じ。ARRは使うけど、SSL Offloadingは行わないので、それぞれのサーバーに証明書がある。

20181114185620.jpg

これに伴って、ブログの公開URLは
になりました。
年内いっぱいくらいでHTTPでのアクセスは遮断する予定です。
やること自体は大して難しくないのに、使っているルーター(RTX1200)のNAPTの設定で見落としがあって、どうやっても外からのHTTPSのアクセスがARRの仮想マシンに入ってこなくて週末全部を棒に振るというバカなことをしてしまったところはあるものの、今は無事に動いてます。
そもそも、ARR自体今回初めて触ったくらいで、プロキシを有効化したときに規定でサーバー名のノードのURL書き換えに作られるHTTPとHTTPSのルールに翻弄されてしまった。
イメージとしては、HTTP_HOSTを見つつ、外部のDNSに登録している2つの全く異なるドメインのどちらに対するアクセス化を判別して適切なVMにリクエストを流すだけで済むんだけど、入ってくるリクエストがHTTPならまだしも、HTTPSだったら、ARRのサーバーに証明書を入れないでどうやってリバースプロキシになるの?っていうところで躓いていたレベル。
そもそも、リバースプロキシを構築するシナリオ自体、インターネットに公開しているドメインが1つしかなくて、URLによって降り先となるサーバーが別なパターンが圧倒的多数。会社のドメインがあって、WWWもあれば、LyncやExchangeも外から繋がるようになっているみたいな。
1つのグローバルIPアドレスで全く異なるドメインをホストするっていうのは情報が少なくて、英語の情報を検索しようにも期待したものにたどり着けなくて苦労した。

最終的にうまく動いているけど、きっとまだそぎ落とせるところがあるはず。当初、ARR用にサーバーを立てるつもりではなくて、MovableTypeをインストールしているサーバーにARRを入れて、全てのHTTPSの通信はこのサーバーを通すつもりだったのに、問題の切り分けのためにARRを別立てにしたことで台数が無駄に増えちゃった。

では、構築の手順。
IISを規定の設定でインストールして、WebPIを有効にして、ARR 3.0とURL Rewriteをインストールする。
ARRの設定でServer Proxy Settingsを開いて、一番上にあるEnable Proxyにチェックを入れる。
それ以外は何もしない。URL Rewriteの設定は有効にしないまま。

20181114191404.png

バックエンドとなる2つのドメインを受け持つサーバーにリバースプロキシするため、サイトを2つ作る。
バックエンドから、それぞれのドメインの証明書を秘密鍵付きでエクスポートしておき、ARRのサーバーにインポートしておく。ストアは個人用ストアでOK。
それぞれのサイトのバインド設定は、各ドメインの証明書を選んでポートは443。また、ホスト名として、公開DNSに登録してあるホスト名を記入する。今回の環境では、一方のドメインにはAとCNAMEで2つあったので、以下のように2つのバインド設定を行っている。

20181114191319.png

あとは、各サイトでURL書き換えを開いて、リバースプロキシのルールを追加する。
設定内容は以下のようになる。
これは、各サイトの物理ディレクトリにweb.configとして保存されているもの。
要は、正規表現の(.*)で、HTTP_HOSTが条件に一致する場合は、バックエンドのサーバーを指定したURLに書き換えて流すという内容。

20181114191503.jpg

終わってみればホントにシンプル。
きっと、MovableTypeをインストールしたサーバーにARRを入れて、NAPTでそっちにリクエストを流すだけでできたはずなんだよな。
それに、MovableType用の証明書はLet's Encryptなので、バックエンドで自動更新するのは勝手にタスクでできるとしても、ARRにインポートしてある証明書は手動でコピーしないとダメじゃんっていう。。。
そのへんは追々直していくしかないだろうね。面倒だから。