【Let'sEncrypt】Certbotの使い方(CentOS7 + nginx)


■環境

CentOS 7.3
nginx 1.10.3
certbot 0.14.1


■初回SSL証明書発行

certbotをインストールする。

yum -y install yum-utils  
yum install certbot  
# もしCentOS6系やAWS EC2にてcertbotをインストールする場合は以下手順となります。
curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto  
chmod 700 /usr/bin/certbot-auto  
ln -s /usr/bin/certbot-auto /usr/bin/certbot  
# certbot-autoのまま使っても良いですが、後述の手順と整合性を合わせるために
# シンボリックリンクを作っています。

証明書を発行する

certbot certonly --webroot -w /usr/share/nginx/html -d your-domain.com  

※上記コマンドは環境に合わせて読み替えてください。
/usr/share/nginx/html
 →設定するドメインのドキュメントルート
your-domain.com
 →設定するドメイン

【補足】
2017年11月現在、AWS EC2では上記コマンドに–debugオプションが必要でした。
調べてみるとEC2でも「–debug」は不要になったと書いてあるページがあったりするので
環境による(?)のかもしれません。

これで証明書が以下ディレクトリに生成されます。

ll /etc/letsencrypt/live/your-domain.com/  
lrwxrwxrwx 1 root root  40 Jun 12 16:41 cert.pem -> ../../archive/your-domain.com/cert1.pem  
lrwxrwxrwx 1 root root  41 Jun 12 16:41 chain.pem -> ../../archive/your-domain.com/chain1.pem  
lrwxrwxrwx 1 root root  45 Jun 12 16:41 fullchain.pem -> ../../archive/your-domain.com/fullchain1.pem  
lrwxrwxrwx 1 root root  43 Jun 12 16:41 privkey.pem -> ../../archive/your-domain.com/privkey1.pem  

証明書更新の度に上記シンボリックリンクの向き先が新証明書に切り替わるので、
nginx側の設定は1度設定すれば変える必要がなくなります。

■nginx設定

nginxの設定ファイルにて、SSL証明書と秘密鍵の設定をします。
(/etc/nginx/nginx.conf)

(省略)  
server {  
    listen  443 ssl http2 default_server;  
    (省略)  
    ssl_certificate "/etc/letsencrypt/live/your-domain.com/fullchain.pem";  
    ssl_certificate_key "/etc/letsencrypt/live/your-domain.com/privkey.pem";  
    (省略)  
}  

設定後、nginxを再起動します。

systemctl restart nginx.service  

■SSL証明書の自動再発行設定

SSL証明書の期限が残り1ヶ月を切ったら、証明書更新が可能となります。
更新は以下コマンドで実施します。

certbot renew  

自動で更新できるように、cronに上記コマンドを登録しておきます。
例として、毎週月曜日の早朝に更新作業を行なうようにします。
(残り期限1ヶ月以上残っている場合は空振りして終わる)

10 0 * * 1 /bin/certbot renew && /bin/systemctl reload nginx.service > /dev/null 2>&1 

※※※ 注意 ※※※
証明書の更新だけしても、nginxにて再読込をしなければ反映されません。

※2020年2月追記
certbot ver1.0.0現在ではrenew後に実行するコマンドを以下のようにオプションで指定できるようになりました。
/bin/certbot renew –post-hook “systemctl restart nginx.service”

これで設定は完了です。

■SSL証明書の削除

不要になったドメインのSSL証明書の削除は以下のコマンドで実施します。

certbot revoke --cert-path=/etc/letsencrypt/archive/your-domain.com/cert1.pem  

これでSSL証明書を無効化し、自動更新の対象からも外れます。