用 Letsencrypt.sh 來自動 renew

上次提到用 Let’s encrypt 把 HTTPS 架起來,之後寫個小 sh,用 crontab 定時跑:

#!/bin/sh
#
# Use for Let's encrypt renew (suggest 60days, expired every 90days)

# Use official client (slow!)
cd /root/ssl/letsencrypt/
./letsencrypt-auto certonly -t --webroot -w /home/of/domain1 -d domain1 --renew-by-default
./letsencrypt-auto certonly -t --webroot -w /home/of/domain2 -d domain2 --renew-by-default
./letsencrypt-auto certonly -t --webroot -w /home/of/domain3 -d domain3 --renew-by-default

#reload new cert into nginx
service nginx reload

因為 cert lifetime是90天,所以大概每60天跑一次 renew就沒有問題了。

30 3 27 */2 * /root/le-renew.sh >> /root/le-renew.log

但是官方的letsencrypt-auto說實話還是很慢,久久在背景跑一次沒差,要是自己手動跑就會受不了。如果是一次有一堆 domain 要 renew 的話會更慘。後來又看到gslin提到有個用 Shell Script 寫的 Let’s Encrypt Client,看起來還真的不錯,就找了點時間跑跑看。雖然還要土法煉一下鋼,不過速度快又方便,所以再次把設定方式分享出來。

#下載 letsencrypt.sh

from https://github.com/lukas2511/letsencrypt.sh

git clone https://github.com/lukas2511/letsencrypt.sh.git

————-

#import accouont key and cert:

(如果一開始就不是用官方 letsencrypt-auto.sh 就跳過這步驟)

照著 https://github.com/lukas2511/letsencrypt.sh/wiki/Import-from-official-letsencrypt-client
把用官方產生的account key 跟certs給 import 進來
過程中也會自己產生 domains.txt
————-

#讓驗證步驟時所需要的 acme-challenge 都指到 /var/www/letsencrypt

nginx 的 sites-available/[specific-domain] 加上

        # (for letsencrypt ssl) link /.well-known/acme-challenge to /var/www/letsencrypt
        # use ln -s /var/www/letsencrypt .acme-challenges for second link
        location /.well-known/acme-challenge {
                alias /var/www/letsencrypt;
        }

 

#指向正確的 acme-challenge

把 letsencrypt.sh 所在目錄下的 .acme-challenges -> /var/www/letsencrypt/

ln -s /var/www/letsencrypt .acme-challenges

#試跑一下

./letsencrypt.sh -c

或是

./letsencrypt.sh -c -x

看有沒有順利更新 cert (放在letsencrypt.sh 所在目錄下的 certs)
如果有,可以把 sites certs 指到這邊來:

nginx 的 sites-available/[specific-domain] 裡的

        ssl_certificate /etc/letsencrypt/live/[specific-domain]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[specific-domain]/privkey.pem;

改成 letsencrypt.sh 所在目錄下的 certs

或是 把 certs 指回官方的 live 目錄

mv le-sh/certs /etc/letsencrypt/certs.le-sh
mv /etc/letsencrypt/live /etc/letsencrypt/live.letsencrypt
ln -s /etc/letsencrypt/certs.le-sh /etc/letsencrypt/live
ln -s /etc/letsencrypt/certs.le-sh certs

 

#設定 crontab

寫個 script (le-renew.sh):

#!/bin/sh
#
# Use letencrypt.sh for renew (fast!)
# can run every 15 days (skip-renew = 30days)
cd [letsencrypt.sh的目錄]
./letsencrypt.sh -c

#reload new cert into nginx
service nginx reload

然後丟進 crontab

30 3 2,16 * * /root/le-renew.sh

搞定,收工。

Update: 這裡有由 gslin 所維護的 letsencrypt.tw,使用 letsencrypt.sh完成所有架設及設定,快速又方便,建議服用 🙂

發佈留言