上次提到用 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完成所有架設及設定,快速又方便,建議服用 🙂