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 に対応するのを待つことにします。