博主在文章 Ubuntu 18.04 使用 Certbot 申请并安装 Let's Encrypt 泛域名证书中介绍了使用 Certbot 申请并安装 Let's Encrypt 泛域名证书的方法,此种方法虽能成功申请泛域名证书,但是却需要手工完成,比较繁琐且不能自动续签。博主今天以托管在腾讯云的域名 yqimage.com 为例,再分享一种使用 Certbot 自动申请并续签 Let's Encrypt 泛域名证书的方法,相比之前的方法更加方便快捷,且一劳永逸。

安装 Certbot

第一步仍然是安装 Certbot,如果你的服务器上已经安装了 Certbot ,请跳过此步。注意,以下命令需要整体复制并粘贴到终端中执行:

apt install software-properties-common -y && \
add-apt-repository ppa:certbot/certbot -y && \
apt update && apt install python-certbot-nginx -y

获取并配置 hook 脚本

本文使用的 hook 脚本支持阿里云 DNS、腾讯云 DNS、华为云 NDS 以及 GoDaddy,脚本的详细介绍点此直达。终端中执行下属命令获取 hook 脚本:

git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au && chmod +x certbot-letencrypt-wildcardcertificates-alydns-au/au.sh

因博主的域名托管在腾讯云,所以需要到腾讯云创建一个 API(点此直达腾讯云的 API 创建页面),并将申请到的 SecretIdSecretKey 配置到 certbot-letencrypt-wildcardcertificates-alydns-au/au.sh 中。

自动申请 Let's Encrypt 泛域名证书

终端中执行下述命令自动申请 Let's Encrypt 泛域名证书。同样的,以下命令需要整体复制并粘贴执行。下述命令中添加了 --dry-run 参数,模拟证书申请过程(实际并未真正申请),看看命令执行的过程中是否报错:

certbot certonly \
--email i@timelate.com \
--agree-tos \
--preferred-challenges dns \
--server https://acme-v02.api.letsencrypt.org/directory \
--manual \
--manual-auth-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy add" \
--manual-cleanup-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy clean" \
-d yqimage.com \
-d *.yqimage.com \
--dry-run

如果报错,根据错误提示进行排查。如果没有报错,执行下述命令正式申请证书:

certbot certonly \
--email i@timelate.com \
--agree-tos \
--preferred-challenges dns \
--server https://acme-v02.api.letsencrypt.org/directory \
--manual \
--manual-auth-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy add" \
--manual-cleanup-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy clean" \
-d yqimage.com \
-d *.yqimage.com

为 Nginx 安装 SSL 证书

首先生成 dhparam.pem 文件以增强 SSL 安全性:

openssl dhparam -dsaparam -out /etc/letsencrypt/ssl-dhparams.pem 4096

将生成的 ssl-dhparams.pem 文件和证书一起添加到 nginxserver 段并启用 SSL :

server {
    listen 443 ssl;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /etc/letsencrypt/live/yqimage.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yqimage.com/privkey.pem;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    ssl_session_timeout 5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    index index.php;   
    server_name    www.yqimage.com;
    root  /var/www/www.yqimage.com;
    ……
}

重载 nginx 生效:

service nginx reload

续签 Let's Encrypt 泛域名证书

续签会使用上一步签发证书时用到的配置(具体配置可通过 cat /etc/letsencrypt/renewal/yqimage.com.conf 查看),因此续签的命令很简单,执行下述命令即可:

certbot renew

此命令会续签服务器上的所有证书,如果只希望续签某一个域名的证书,执行下述命令即可:

certbot renew --cert-name yqimage.com

使用 --force-renewal 参数强制对域名进行续签,此参数可忽略证书的到期时间:

certbot renew --force-renewal

certbot renew --force-renewal --cert-name yqimage.com

完整的、带有配置的续签命令如下:

certbot renew --force-renewal \
--cert-name yqimage.com \
--preferred-challenges dns \
--server https://acme-v02.api.letsencrypt.org/directory \
--manual \
--manual-auth-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy add" \
--manual-cleanup-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy clean"

自动续签 Let's Encrypt 泛域名证书

通过添加 crontab 定时任务自动续签 Let's Encrypt 泛域名证书:

crontab -e

添加定时任务如下:

#证书有效期 <30 天才会 renew ,所以 crontab 可以配置为 1 天或 1 周
0 1 */1 * * certbot renew --cert-name yqimage.com --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory --manual --manual-auth-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy add" --manual-cleanup-hook "/root/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python txy clean" >/dev/null 2>&1

通过以上步骤便可在 Ubuntu 18.04 使用 Certbot 自动申请并续签 Let's Encrypt 泛域名证书,本文结束。

文章目录