0. 背景
無料のSSL証明書ということで話題のLet's Encryptですが、実際の利用のためには 90日ごと に証明書を更新しないといけないという制約から、なかなか本番利用するには腰が重くなってしまいます。
(もちろん本家では、全自動で更新することを推奨しています。)
ましてや、AWS ELB
などのロードバランサーを利用し、配下に複数のWebサーバがいると、ACMEプロトコル
を通過させるだけで一苦労です。
そこで、nginxのリバースプロキシを使うことで、既存のアプリケーションに影響をあたえること無く、Let's Encryptの更新を済ませる方法を試しました。
1. 前提
今回は、以下の様な環境を想定します。
-
www.example.com
で受けるELBの配下に複数のWebサーバがある -
stg.example.com
で受けるELBの配下にWebサーバがある -
www.example.com
とstg.example.com
に利用する証明書は1つにまとまっていて良い
2. letsencrypt実行サーバの用意
Amazon Linuxからのletsencrypt
の実行はまだ不安定で、本番利用のサーバに不要なライブラリをインストールしたくはないので、あたらしくletsencrypt
実行専用のサーバを用意します。
今回は、CentOS7を利用しました。
サーバ起動後に必要な依存関係は git
のみです。
その後、letsencrypt
をインストールします。
また、後述のリバースプロキシのために、firewalld
を切っておきます。
(firewalld
を閉じる前に、セキュリティグループが閉じていることを確認してください)
# yum install git
# systemctl stop firewalld.service
# cd /usr/local/src
# git clone https://github.com/letsencrypt/letsencrypt.git
# cd letsencrypt
これでサーバの準備は完了です。
Route 53から、letsencrypt.example.com
というドメインがこのサーバを指すようにレコード指定しておきましょう。
このまま、以下のコマンドを実行するとLet's Ecnrypt
から証明書を取得しますが、指定したすべてのドメインへのリクエスト(ACMEプロトコル
)が自分のサーバに届かないといけないので、失敗します。
3. リバースプロキシの設定
www.example.com
とstg.example.com
へのアクセスがletsencrypt実行サーバ
へ迂回するように、それぞれのサーバで動いているnginx
のリバースプロキシ設定を行います。
Let's EncryptのACMEプロトコルは /.well-known/...
へアクセスしてくるので、このディレクトリだけプロキシすれば十分です。
この設定のおかげで、本番環境への影響がなくなります。
server {
listen 80;
server_name www.example.com;
...
# lets encrypt ACME proxy
location /.well-known {
proxy_pass http://letsencrypt.example.private;
}
}
ここで、リバースプロキシ先のホストをletsencrypt.example.private
と置くことで、次回更新時に同じ作業をスキップすることができます。
その後は、Route 53でletsencrypt.example.private
のPrivate DNSを設定しましょう。
4. letsencryptの実行
letsencrypt実行サーバ
に戻ってletsencryptコマンド
を実行しましょう。
# pwd
/usr/local/src/letsencrypt
# ./letsencrypt-auto certonly --standalone -d www.example.com -d stg.example.com -d letsencrypt.example.com
上記を実行すると、以下のディレクトリに証明書が生成されます。
# cd /etc/letsencrypt/live/letsencrypt.example.com
# ls
cert.pem chain.pem fullchain.pem privkey.pem
privkey.pem
をプライベートキー
、fullchain.pem
をパブリックキー証明書
と読み替えて、ELBのSSL証明書を設定します。
以上で、ダウンタイムなしのELBの証明書更新が完了します。
今回は試していませんが、AWS CLI
を利用することで、全自動にすることも可能です。
5. まとめ
無料で使えるSSL証明書とはいうものの、その設定にはまだ枯れていない部分があります。
TokyoリージョンでのAWS Certificate Manager
が利用できるまではこの記事が役に立つのではないでしょうか?