無料でSSLドメイン認証書が利用できるLet’s Encryptを使ってCloudFrontにSSLの設定してみたので手順を残しておく。letsencrypt-s3frontを使うことで少しだけ楽ができるのでこちらの使い方も書く。

Let’s Encryptとは

Internet Security Research Group (ISRG) が運営しており、スポンサーにCISCO、Facebook、HP等の大きな会社がついている証明書サービスです。

無料のSSL証明書としてAWS Certificate Managerがあるが、Let’s Encryptは証明書発行時にメールアドレスの設定が不要なため簡単に利用開始できる。AWS Certificate Managerとの簡単な比較は次の通り。

項目 Let’s Encrypt ACM
費用 無料 無料
有効期限 90日 自動更新
対象 サーバ CloudFront, ELB
認証 Let’s Encryptのサーバからの接続 メール認証

証明書の取得

Certbotというツールを使うことで対話型の操作で簡単に証明書が取得できるのでこちらを利用する。

Certbotインストール

Gitからcloneするだけで簡単にインストールができる。

$ git clone https://github.com/certbot/certbot

証明書取得

./certbot-auto --help allでコマンドのhelpを見ることができる。コマンドの実行環境にwebサーバがあれば自動でsslの設定までやってくれるが、今回はCloudfrontに設定するのでcertonlyでishii.techのドメイン証明書のみ取得する。
何度も再取得すると制限がかかり発行できなくなるため、証明書を捨てない様にしたほうがよい。

$ cd certbot
$ ./certbot-auto certonly -m ishii.tech@gmail.com -d ishii.tech \
-v --agree-tos --manual --manual-public-ip-logging-ok

ここで、Press ENTER to continueと表示され認証用のファイルをS3にアップロードする必要がある。

画面に表示されたパスに対して指定された文字列のファイルを作成しアップロードする。

$echo "*********" > key.txt
$ aws s3 cp key.txt s3://YOUR_BUCKET_NAME/.well-known/acme-challenge/******* \
--acl public-read

※S3に接続するための権限(例えばAmazonS3FullAccess)が必要。

Press ENTER to continueを押すと以下の様に証明書が発行される。

$ /etc/letsencrypt/live/ishii.tech/
cert.pem chain.pem fullchain.pem privkey.pem

ファイルは以下のとおり。

  • cert.pem : 証明書
  • chain.pem : 中間証明書
  • fullchain.pem : 証明書 + 中間証明書
  • privkey.pem : 秘密鍵

iamに証明書をアップロードする。

前の手順で発行された証明書をiamにアップロードする。

$ aws iam upload-server-certificate \
--server-certificate-name ishiis.tech.20160704 \
--certificate-body file:///etc/letsencrypt/live/ishii.tech/cert.pem \
--private-key file:///etc/letsencrypt/live/ishii.tech/privkey.pem \
--certificate-chain file:///etc/letsencrypt/live/ishii.tech/chain.pem \
--path /cloudfront/

※iamに接続するための権限(例えばIAMFullAccess)が必要。

出力が以下のような形になればOK。

{
"ServerCertificateMetadata": {
"ServerCertificateId": "*********",
"ServerCertificateName": "ishiis.tech.20160704",
"Expiration": "2016-10-02T09:45:00Z",
"Path": "/cloudfront/",
"Arn": "*********",
"UploadDate": "2016-07-04T10:51:44.455Z"
}
}

UploadDateからExpirationまでが90日になっていることが確認できる。3ヶ月で失効してしまうので2ヶ月経ったら更新するといった使い方がいいかもしれません。

CloudFrontでSSLの設定

ブラウザからCloudFrontのSSLの設定をするDistributions -> General -> editで以下の様にCustom SSL Certificateを選択し、アップロード時に指定したserver-certificate-nameの証明書を選択して保存します。

HTTPSを強制したい場合はBehaviorsからRedirect HTTP to HTTPSを選択して保存すればよいです。

設定が完了しても適用されるまでには10分程度時間がかかるので注意が必要です。

正しく設定できている場合は以下のようにhttpsになっていることが確認できます。

letsencrypt-s3front

letsencrypt-s3frontがS3に認証用のファイルをアップロードして証明書のダウンロードまでやってくれるので少しだけ楽ができます。コマンドの引数的にはCloudfrontの証明書の選択もやってくれそうな雰囲気だが、うまく動いていない(?)のでiamに証明書をアップロードするところとCloudFrontで証明書を選択する手順は自分でコマンドを叩いて実行しました。

インストール

次のコマンドでインストールする。

$ easy_install pip
$ pip install letsencrypt
$ pip install letsencrypt-s3front

証明書作成

$ AWS_ACCESS_KEY_ID="your_key" \
AWS_SECRET_ACCESS_KEY="your_secret" \
letsencrypt --agree-tos -a letsencrypt-s3front:auth \
--letsencrypt-s3front:auth-s3-bucket the_bucket \
--letsencrypt-s3front:auth-s3-region ap-northeast-1 \
-i letsencrypt-s3front:installer \
--letsencrypt-s3front:installer-cf-distribution-id E225OT******** \
-d ishii.tech

※S3の書き込み権限が必要。

アップロード

$ aws iam upload-server-certificate \
--server-certificate-name ishiis.tech.20160704 \
--certificate-body file:///etc/letsencrypt/live/ishii.tech/cert.pem \
--private-key file:///etc/letsencrypt/live/ishii.tech/privkey.pem \
--certificate-chain file:///etc/letsencrypt/live/ishii.tech/chain.pem \
--path /cloudfront/

CloudFrontの設定

前の手順と同様にブラウザからCloudFrontのSSLの設定をする。Distributions -> General -> editでCustom SSL Certificateを選択し、アップロード時に指定したserver-certificate-nameの証明書を選択して保存する。

その他のコマンド

参照。

$ aws iam get-server-certificate \
--server-certificate-name ishii.tech.20160704

一覧。

$ aws iam list-server-certificates

削除。

$ aws iam delete-server-certificate \
--server-certificate-name ishii.tech.20160704

まとめ

コマンドだけの操作で無料のドメイン証明書が使えるのでかなりいい感じ。90日の期限があるため、Lambdaから60日毎に更新するといいかなと思っていたけどCloudFrontのSSLを選択するところのコマンドが無いので2ヶ月に1回手動で対応することになると思う。そしてこの更新が面倒になってACMに移行している自分の姿が見える。

SSL化したあとはGoogle Search Consoleへの登録とGoogle Analyticsのhttpsへの変更をお忘れなく。

おわり。

参考

  1. https://letsencrypt.org/
  2. https://certbot.eff.org/
  3. https://github.com/dlapiduz/letsencrypt-s3front
  4. http://docs.aws.amazon.com/cli/latest/reference/iam/index.html