自分用の覚え書きです。
環境
- Debian GNU/Linux Jessie
- さくらVPS
- ドメイン取得・DNS設定済
- Let’s Encrypt を利用
準備
手順は大体ここに載っているとおり。ドメインが割り当てられたホストにログインして certbot を使って証明書を発行します。Debian の Jessie の場合、APT リポジトリに backports を追加します。
# echo 'deb http://ftp.debian.org/debian jessie-backports main' \
>> /etc/apt/sources.list
# apt update
backports から certbot をインストールします。
# apt -t jessie-backports install certbot
次にファイアウォールで外部から80番(HTTP)ポートにアクセスできるようにしておきます。Let’s Encrypt のホストがドメインを確認する時に接続し、certbot が実行されているホスト、申請内容が正しいかチェックするためです。iptables/ufw、各種クラウドサービスのインバウンド設定は割愛します。
証明書の発行
certbot を実行します。 -d
オプションでドメインを指定します。複数個を指定して OK です。
# certbot certonly --standalone -d example.com -d www.example.com
画面に表示される手順に従って、項目を入力していきます。メールアドレスは、証明書の失効の通知などが届く連絡先になります。ここでは、HTTPD を止めると書いてありますが、私の環境では無停止でいけました。HTTPD が立ち上がってたらcertbot が80番でListenしなくなった、とかそういう事かな。
端末に
IMPORTANT NOTES:
とメッセージが出て、ドメインや失効日が表示されたら正常終了です。次の場所に証明書が保存されます。
/etc/letsencrypt/live/example.com/*.pem
nginx の設定
設定ファイルの server 項目を下記のように編集します。
# -- snipped --
server {
listen *:80;
server_name example.com *.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# -- snipped --
非SSL(http://~)経由でのアクセスをSSL経由のアクセスをするようリダイレクトしています。また、SSL のプロトコル指定では、脆弱性がある SSLv3 を抜いて無効にしています。 コンフィグテストを行なって問題がないようであれば、リロードします。
# /etc/init.d/nginx configtest
[ ok ] Testing nginx configuration:.
# /etc/init.d/nginx reload
必要に応じて、外部から443番ポートへのアクセスを許可すれば完了です。
証明書の更新
Let’s Encrypt が発行してくれる証明書は90日間で失効します。定期的に更新する必要があります。 手動で行うには certbot コマンドに renew
オプションを与えます。このホストに登録されている Let’s Encrypt のすべての証明書の有効期限を調べ、失効日が近いものを更新してくれます。 試しに実行してみると
# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
#
となりました。先ほど作ったばかりの証明書なので、ここは「リニューアルする必要なし」です。
手動更新はアレですので、cron に登録しておきます。
# echo 'certbot renew && /etc/init.d/nginx reload' > /etc/cron.weekly/certbot
# /etc/init.d/cron reload
以上です。
参考
- Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル
- SSL/TLS証明書無料化は進むか? ~Let’s Encryptに見る無料SSL/TLS証明書の台頭とその注意点~ | GMOグローバルサインブログ
- Let’s Encrypt で Nginx にSSLを設定する – Qiita