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/
関連するタグ
関連するタグは現在ありません。