Let's encryptでSSL証明書を取得
無料で簡単にSSL証明書を発行できる。Let's encryptは安全性の高いSSL通信を広めようとしている非営利団体なので、無料でも怪しいところでは無い。
基本的に
ここ読みゃいい→Let's Encrypt の使い方 - Let's Encrypt 総合ポータル
上記サイトが閉鎖されてたので移転先→Let's Encrypt の使い方 - Let's Encrypt 総合ポータル
以下、個人的メモを挟んだ上記の抽出。
想定環境
- Ubuntu 16.04 LTS
- Apache2
- ドメイン取得済み
なお、Amazon EC2の場合は公式に丁寧なチュートリアルがある。
手順
インストール
$ sudo apt-get install letsencrypt python-letsencrypt-apache
2つめのpython-letsencrypt-apacheはいらないかも?
確認
$ sudo letsencrypt
上記解説サイトでは、実行コマンドはcertbotとなっているが、Ubuntuの場合はこっち
青い画面に切り替わってビビるが、解説サイト通りNoを選択
証明書発行
$ sudo letsencrypt --help
コマンド指定方法を確認
[SUBCOMMAND]のデフォルトはrunとなっていて、証明書取得と同時にWebサーバ設定もやってくれると書いてあるが、実際やってみると
$ sudo letsencrypt --webroot -w (ApacheのDocRoot) -d (所有ドメイン) With the webroot plugin, you probably want to use the "certonly" command, eg: letsencrypt certonly --webroot
となり、取得だけを実行するcertonlyの指定を薦められた。ここ、後で考えると–webroot
でなく–apache
を指定した方が良かったのかも?
とりあえず実践時は、言われるままにcertonlyを選択
$ sudo letsencrypt certonly --webroot -w (ApacheのDocRoot) -d (所有ドメイン)
何かあったときの連絡用メールアドレスを求められるので入力
利用規約に同意
これだけで、証明書が取得でき、秘密鍵などあわせて所定の場所に生成される。
IMPORTANT NOTES: - If you lose your account credentials, you can recover through e-mails sent to (メルアド). - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/(ドメイン名)/fullchain.pem. Your cert will expire on (有効期限). To obtain a new version of the certificate in the future, simply run Let's Encrypt again. ...(略)
- 資格情報無くしたら、メルアドに送られたメールから回復できるよ
/etc/letsencrypt/live/(ドメイン名)
以下に、必要な認証ファイル作っといたよ- 有効期限は3ヶ月で切れるよ
- 再取得はもう一回letsencrypt実行すれば出来るよ
Apache設定
/etc/apache2/sites-available/default-ssl.conf
を編集
# SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem # SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key SSLCertificateFile /etc/letsencrypt/live/(ドメイン名)/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/(ドメイン名)/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/(ドメイン名)/chain.pem
もしSSL設定を有効にしてなければ、有効化
$ a2enmod ssl $ a2ensite default-ssl
再起動
$ sudo service apache2 restart
証明書自動更新
有効期限は3ヶ月しか取れないため、定期的に更新の必要があるが、3ヶ月に1回って忘れそうな絶妙なライン。
letsencryptは、取得時もそうだが、更新時もコマンド一発でできるので、サーバのCRONに自動実行させることができる。
具体的には、以下のコマンドで良い。
$ sudo letsencrypt renew $ sudo service apache2 restart
ただ、有効期限間近で無いと更新できずエラーが返るが、エラー前提で頻繁に問い合わせるのもスマートじゃ無い。かといって期間を空けると運悪く更新タイミングで実行できず、期限切れになるのもやりたくない。
その際、–force-renewal
を付けると一定期間内の上限付きで、いつでも更新できるようになる。これを使って1~2ヶ月に1回程度実行しておく。
$ crontab -e
0 0 1 */2 * sudo letsencrypt renew --force-renewal && sudo service apache2 restart
なお、tty経由でないsudoの実行は、以下参照。