AWS

無料でSSL/TLC証明書を手に入れる EC2/ElasticBeanstalk編

投稿日:

Certbotを使って Conoha+Kusanagi(nginx/centos7) に無料でSSL/TLC証明書をインストール・自動更新する方法は過去に書いた。"無料でSSL/TLC証明書を手に入れる"

CertbotサイトにOSとWebサーバの組み合わせを入力すると対応するインストール手順が表示される。メジャーな組み合わせであれば証明書の取得から自動更新まで全自動でやってくれる。

2016年7月現在、AWS(EC2)は未対応のため、Certbotツールを使って試行錯誤する必要がある。Certbotの一次情報をもとに何とかやってみたので記録を残しておく。

  • AWS(EC2)にCertbotでSSL/TLC証明書をインストールする
  • ElasticBeanstalkのロードバランサに取得した証明書を登録しhttpsでアクセスできるようにする
  • 自動更新のセットアップを行う

AWS(EC2)にCertbotを使ってSSL/TLC証明書をインストールする

いくつか前提がある。

  • ドメインは取得済みであること。
  • ドメインがElasticBeanstalkのIPアドレスを指すようにRoute53を設定済みであること。
  • EC2インスタンスにSSHでログインできるようにしておく。
  • Certbot利用時、外部からEC2インスタンスにhttpでアクセスを受ける。ElasticBeanstalkにRoutingを変更するようなアプリがデプロイされているとアクセスが失敗するのでDocumentRootにindex.phpがあるだけという状態にしておく。
  • SSL/TLC証明書をインストールするだけなら443番を開けておく必要はない。ロードバランサはデフォルトの80番だけ開けていれば良い
  • EC2インスタンスのrootパスワードが設定済みであること
  • AWS CLIがインストール済みであること。
  • IAMで証明書登録ポリシーを付与済みであること。

さっそくEC2インスタンスにログイン。基本的にec2-userで作業する。
一応下記を実行。

Certbotをダウンロードする。

Certbotを実行してみる。その際、--debugオプションを付けないと怒られる。would like to work on improving it と言っておきながら --debug がmust。きっと実行内容がCertbotに送られるのだろう。

指示通り、--debugオプションを付けて実行してみる。

いろいろインストールされる。/home/ec2-user/.local/share/letsencrypt/ 以下にPython27 が入る。今回の試行錯誤では自力でPythonを上げなかった。たぶん、自力でPythonのバージョンを上げなくてもコレが使われるんじゃないか。

肝心のインストーラはインストールされず、"letsencrypt-auto certonly"というコマンドを実行せよ、と出る。が、これはtypo。

No installers are available on your OS yet; try running "letsencrypt-auto certonly" to get a cert you can install manually

ディレクトリを移動する。

ここにある certbot コマンドを叩く。ドメイン名、メールアドレスを指定する。

すると、中途半端にグラフィカルな画面が表示される。簡易Webサーバを起動するか、現在のWebサーバのDocumentRootを教えるか、2択となる。簡易Webサーバだとどうしても上手くいかなかった。Webサーバを上げたまま(ElasticBeanstalkのヘルスチェックがOKの状態)、DocumentRootを指定すると上手くいった。

うまくいくと、以下のようなメッセージが表示される。

/etc/letsencrypt/live に証明書が作られている。なお、live には ec2-user でアクセスできない。ここでrootに昇格。

ElasticBeanstalkのロードバランサに証明書を登録する

AWS CLI経由で証明書を登録する。その際、IAMにてポリシーを追加しておく必要がある。過去エントリを参照のこと。成功するとJSONで登録情報が返る。ここでは、HogeCertification という名前で登録を行っている。

ElasticBeanstalkのロードバランサの設定で、証明書欄から HogeCertification を選べるようになる。選んで 443/HTTPS を通すようにすれば、晴れて https://独自ドメイン/ で ElasticBeanstalk の URL が開く。

証明書の自動更新

更新自体はcertbot renewコマンドで行う。certbot renewコマンドは/var/www/html/.well-known/以下にファイルを置いて外部から開きにくる。困ったことに、CakePHPやLaravelアプリをデプロイしているとフレームワークのルーティング機能により上手くいかない。
以下の戦略で対応する。

  1. certbot renew 時だけ、DocumentRoot を アプリ用からcertbot用に切り替える
  2. Laravel等のように DocumentRoot がサブディレクトリにオフセットされている場合に対応する

ElasticBeanstalkで自動生成される環境を見ると、/var/www/html が /var/app/current へのシンボリックリンクとなっている。Certbot renew を叩くときだけ、シンボリックリンクを差し替える。

また、certbot用の.well-knownディレクトリが /var/www/html 直下に作られる仕様になっている。DocumentRootはさらに project/public にオフセットされているため、/var/www/html/project/public/.well-known が /var/www/html/.well-known を指すようにシンボリックリンクを作成する。

この状態で certbot renew --dry-run を叩くと無事成功する。

シンボリックリンクの作成は一度だけで良いが、アプリ用とCertbot用のシンボリックリンク張替は都度必要となる。

以下のシェルスクリプトをcronで叩けば良い。

不要な更新は実行されないため、1日2回の頻度で実行してよい旨、ドキュメントに記述がある。

Note: if you’re setting up a cron or systemd job, we recommend running it twice per day (it won’t do anything until your certificates are due for renewal or revoked, but running it regularly would give your site a chance of staying online in case a Let’s Encrypt-initiated revocation happened for some reason). Please select a random minute within the hour for your renewal tasks.

-AWS

Copyright© ikuty.com , 2018 AllRights Reserved Powered by AFFINGER4.