Let's encrypt で ELB のSSL証明書を作る
AWS の ELB(Elastic Load Balancer)用のSSL証明書を、AWS Certificate Manager でタダで作りたかったのですが、残念ながら東京リージョンに対応していません。CloudFront では使えるのにっ。
そこで、無料SSL証明書が作り放題の Let’s encrypt (https://letsencrypt.org/) を使うことにしました。今までのSSL証明書発行と根本的に違うので、最初とまどいました。でもわかってしまえば簡単。単に、SSL証明書を発行したいドメインのWebサーバ上で Let’s encrypt のツールを動かすだけなのです。
https://example.com/ の証明書を発行したい、とします。ウェブサーバを1台用意して、example.com の DNS をこのウェブサーバに向けます。既に稼働しているサーバの場合は、Apache や Nginx が動いていることでしょう。その場合、Let’s encrypt は自動的にこれらのサーバのドキュメントルートにファイルを作成し、そのファイルを Let’s encrypt のサーバからアクセスしてもらって疎通確認をします。新規のドメインだともっと簡単で、新しいウェブサーバ上でスタンドアローンの Let’s encrypt を動かすだけです。ウェブサーバを内包しているんですね。
で、このドメインに任意のコンテンツを置けるということは、このドメインの所有者であるということだから、SSL証明書を受け取る資格を持っているということなのです。Google Webmaster tools などのドメイン所有者確認方法と一緒です。
ELB用のSSL証明書を発行する場合、ELB上では Let’s encrypt を動かせませんから、使い捨てのサーバを1台用意してやります。なんでもいいけど、AWS で microインスタンスを新規に立ち上げます。そして、DNS の設定で、発行を希望するドメインをそのインスタンスに向けてやる。
というわけで Let’s encrypt。
$ sudo su
# yum install git
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt/
# ./letsencrypt-auto --help --debug
(いろいろ自動でインストールしてくれる。Amazon Linux のサポートは experimental なので --debug をつけないと起動しない)
# ./letsencrypt-auto certonly --standalone -d example.com
(昔懐かしのブルーバックの画面で連絡先メアドを聞いてくる。あとライセンスへの同意)
# ls /etc/letsencrypt/
accounts archive csr keys live renewal
# ls /etc/letsencrypt/live/
example.com
# ls /etc/letsencrypt/live/example.com/
cert.pem chain.pem fullchain.pem privkey.pem
できました。ELB にアップロードしましょう。ここで一つ大事な話があります。AWS Console を使う場合、Certificate Chain の chain.pem を「Certificate Chain」欄に入力してはいけません。Public Key Certificate欄に、cert.pem、chain.pem を上下につなげてこの順番でコピペしましょう。
ところで、Let’s encrypt の SSL証明書は 90日で期限切れになるのです。90日ごとにこんな作業やっていられません。そこで、作成して ELB に自動投入、というスクリプトを作っている方々がちらほらいらっしゃいます。
でも、僕は怠惰なので、AWS Certificate Manager が東京リージョンの ELB に対応するのを待つことにします。