Movable Type for AWSのAMI環境への無料SSL(Let's Encrypt) の導入

※記事タイトル変更しました。

まずはじめに

最近GoogleがサイトのSSL化を推奨するとか、SSLをデフォで使っていこう的な動きが世間的にあるようなので、その流れに乗ってみることにする。

なお、本サイトは対応済み。少しCMS側の微調整必要かもしれないけど(´ー`)

Let's Encryptとは

  • ざっくり言うと、有志で行なっている無料SSLサービス。
  • 商用利用も可能。
  • 2016/4/12より正式にサービス開始となった。
  • 設定すれば証明書の自動更新もできる。

参考

Let's Encrypt 総合ポータル ※公式サイトでないので注意.
https://letsencrypt.jp/

大企業や公共団体のサイトへの適用

Let's Encryptは組織の正当性を証明するような高度な機能は持たない(具体的には、ドメイン認証のみ)。
大企業や公共団体のサイトには、サポートや高度な機能を持つ有償のものを使うほうが良いかと思われる。

というか、そもそもで一部環境では、Let's Encryptの利用に利用するcertbot-autoコマンドで正式にサポートしてないよ的な警告文が出る(後述)。

参考

SSL/TLS証明書無料化は進むか? ~Let's Encryptに見る無料SSL/TLS証明書の台頭とその注意点~ | GMOグローバルサインブログ
https://jp.globalsign.com/blog/2016/freessltls_letsencrypt.html

AWSの無料SSLって

AWSにも一応無料SSLは有り(AWS Certificate Managerによる)、「じゃあそれ使えよ」となりがちだが、利用には次のいずれかの有償サービスの利用が前提。

  • Elastic Load Balancing (ELB)
  • CloudFront

無料SSL導入前から既にこれらサービスを運用環境に利用してるなら良いが、それでなければ結局お金がかかる。
と言うことは、少なくともEC2のt2.microだけ、というかこのサイトだとだめじゃん(x_x)。

certbot-auto のセットアップと証明書の自動生成

前提

AWS(EC2)の6A提供のAMI(Movable Type のt2.micro)でやる。
https://aws.amazon.com/marketplace/pp/B00M9ODCAA/ref=_ptnr_sajp_aws_
ちなみに、ウェブサーバー(nginxの設定)は行っておらず、そのまま。

試行と結果

作業は専らSSHで行う。

まず、cerbot-autoのインストール。といってもコマンド自体はシェルスクリプトなので、ソースインストールとかは不要。
ファイルを置くだけ。

curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
# chmod 700 /usr/bin/certbot-auto

次のコマンド実行すると、

sudo certbot-auto certonly --webroot -w /data/file/static -d www.hoge.net --email hoge@fuga.net

次のメッセージが表示された。

FATAL: Amazon Linux support is very experimental at present...
if you would like to work on improving it, please ensure you have backups
and then run this script again with the --debug flag!

ググったところ、実験的なサポートしかしてないよ、と言う意味、とのこと。

--debug オプションをつけて再実行。

sudo certbot-auto certonly --webroot -w /data/file/static -d www.hoge.net --email hoge@fuga.net --debug

yum が実行されてcertbot-auto 実行の為のミドルウェア調整が実行される。

その後、次のメッセージが表示される。

完了しました!
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:

答えると、次の質問が出る。

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

答えると、後は自動で処理して、次のメッセージが出てきて成功した模様。

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.hoge.net
Using the webroot path /data/file/static for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.hoge.net/fullchain.pem. Your cert will
expire on 2017-06-02. To obtain a new or tweaked version of this
certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

あとはnginxの設定にssl対応の設定を書き込むだけ。
/data/conf/nginx.conf を開き、デフォルトで無効になっているSSL周りの設定を有効にする。具体的には次のような感じ。

    server {
listen 443;
include /data/conf/nginx_common.conf;

ssl on;
ssl_certificate /etc/letsencrypt/live/www.hoge.net/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/www.hoge.net/privkey.pem;
}

後は、nginxを再起動するだけ。

sudo service nginx restart

これで、一応CMS管理画面およびCMSから出力したウェブサイトにhttpsから始まるURLでアクセスできるようになった。
ただしこの手順だけだと、一部CMS管理画面やサイト内ページで、オリジンエラーもしくは画像が表示されないなど問題が出る場合もある。この場合カスタマイズ必要。

手前味噌だが、次の記事など参考にすると良いかも。
/knowledge/2014/140615_000012.html

参考

さくらのナレッジ > ナレッジ > エンジニア向け > Let’s EncryptのSSL証明書で、安全なウェブサイトを公開
http://knowledge.sakura.ad.jp/knowledge/5573/
導入手順を詳しく解説されている。

Let’s Encryptで証明書を発行する - Qiita
http://qiita.com/hidechae/items/f42176b9f9ff48f574f4
EC2でのcertbot-auto の実行時に警告出る場合の対処法を参考とさせていただいた。

(追記)証明書の自動更新

crontab -e で、例えば次のように指定する。なお、実行時の権限はec2-userで実行する想定。

50 3 * * 0 sudo certbot-auto renew --post-hook "sudo service nginx restart" 1 > /dev/null 2 > /dev/null

なお、検証しようとしてこのコマンドを手動で実行したら、次のようなメッセージが出た。

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/www.hoge.net.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
/etc/letsencrypt/live/www.hoge.net/fullchain.pem (skipped)
No renewals were attempted.
No hooks were run.

要は、「まだ作ったばっかなのに更新してんじゃねーよ」と言うこと(前回作ったのは昨日)。

これだと検証できないので、強制的に更新させるオプション( --force-renewal)をつけて実行。

sudo certbot-auto renew --force-renewal --post-hook "sudo service nginx restart"
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/www.hoge.net.conf
-------------------------------------------------------------------------------
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for www.hoge.net
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0001_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0001_csr-certbot.pem

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/www.hoge.net/fullchain.pem
-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/www.hoge.net/fullchain.pem (success)
Running post-hook command: sudo service nginx restart

更新できた(´ー`)

ただ、--force-renewalオプションは乱発すると更新の「レート制限」に引っかかってしばらく更新できないそうなので、注意すること。
あと乱発がダメなのは、運営側に負担をかけない意味もある。※詳しくは後述参考の公式の説明を参照。

(追記:17/09/09)

cronでsudo 含むコマンドを指定すると上手く実行されない場合があります。
sudoを使えるようにする方法は他の方がWeb上で紹介されていますが、併せてセキュリティ的によろしくない、という事も紹介されています。
踏まえて対応としては、sudo 使わなくても実行権限のあるユーザーで実行するしかないかな、など考え中。
(誰か良さげな方法教えて、、><)

参考

Let's encrypt運用のベストプラクティス - Qiita
http://qiita.com/tkykmw/items/9b6ba55bb2a6a5d90963

公式によるレート制限についての説明。
https://letsencrypt.org/docs/rate-limits/

関連するタグ

関連するタグは現在ありません。