無料で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 |
ここで、Press ENTER to continueと表示され認証用のファイルをS3にアップロードする必要がある。
画面に表示されたパスに対して指定された文字列のファイルを作成しアップロードする。
$echo "*********" > key.txt |
※S3に接続するための権限(例えばAmazonS3FullAccess)が必要。
Press ENTER to continueを押すと以下の様に証明書が発行される。
$ /etc/letsencrypt/live/ishii.tech/ |
ファイルは以下のとおり。
- cert.pem : 証明書
- chain.pem : 中間証明書
- fullchain.pem : 証明書 + 中間証明書
- privkey.pem : 秘密鍵
iamに証明書をアップロードする。
前の手順で発行された証明書をiamにアップロードする。
$ aws iam upload-server-certificate \ |
※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 |
証明書作成
$ AWS_ACCESS_KEY_ID="your_key" \ |
※S3の書き込み権限が必要。
アップロード
$ aws iam upload-server-certificate \ |
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への変更をお忘れなく。
おわり。