Let's Encrypt通配符证书续期及分发

由于家里使用的宽带没公网IP,为了接入智能音箱的skill,采取了VPS反向代理方式提供对接服务。由于对接服务需要使用https,因此申请了免费的Let’s Encrypt证书。Let’s Encrypt证书的有效期为3个月,做个自动续期脚本还是需要的,不过通配符证书只能用DNS验证,没有现成的腾讯云续签脚本,得自己写下;考虑到VPS的临时性(都是薅各种云的试用羊毛),不打算在VPS上部署证书自动续期脚本,考虑用scp命令将证书推送过去。


0.目标

家里的服务器自动续期证书,并将新证书推送到指定的VPS上。

INFO:服务器系统均为Ubuntu。


1.续期

  • 安装certbot工具
1
git clone https://github.com/certbot/certbot
  • 下载腾讯云的DNS更新脚本(下载地址),编辑qcloud.php,填写secretId和secretKey
1
2
3
#qcloud.php
define("secretId", "填写secretId");
define("secretKey", "填写secretKey");
  • 设置计划任务
1
2
3
4
5
6
# 切换root用户
sudo su
#
crontab -e
# 一周运行一次
0 3 * * 1 [certbot工具目录]/certbot-auto renew --cert-name [域名例如ljr.im] --manual-auth-hook [DNS更新脚本目录]/certbot-dns-qcloud/au.sh

INFO:自行替换[ ]部分。


2.分发

为了使脚本可以定期自动执行,需要配置scp免密传输证书。

  • PC1生成钥匙对(PC1当前用户user1)
1
2
# 生成钥匙对
ssh-keygen -b 1024 -t rsa

INFO:在程序提示输入passphrase时直接输入回车,表示无证书密码。上述命令将生成私钥证书id_rsa和公钥证书id_rsa.pub,存放在~/.ssh/目录,即当前登陆用户的用户目录中。

  • PC2添加信任user1(PC2当前用户user2)
    1
    2
    3
    4
    5
    6
    7
    8
    # 创建.ssh目录,如果已存在目录可跳过
    mkdir ~/.ssh
    # 设置权限,如果已存在目录可跳过
    chmod 700 ~/.ssh
    # 编辑authorized_keys文件,并将PC1的id_rsa.pub的内容添加到authorized_keys文件的尾部。
    vi ~/.ssh/authorized_keys
    # 设置权限,如果文件已存在目录可跳过
    chmod 600 ~./ssh/authorized_keys

WARN:通过以上配置,user1可以以user2的身份登陆到PC2上进行复制,即PC1的user1用户可以免密执行scp [本地路径] [user2]@[PC2域名或IP]:[远程路径]
INFO:复制时候要注意PC2的user2对远程路径有写权限。

  • PC1设置定期推送计划任务
    1
    2
    3
    4
    5
    6
    7
    # 切换到user1(PC2的信任用户)
    su user1
    # 设置计划任务,user1执行scp
    crontab -e
    # 一周运行一次,复制privkey.pem和fullchain.pem即可
    0 3 * * 2 scp /etc/letsencrypt/live/[域名例如ljr.im]/privkey.pem [user2]@[PC2域名或IP]:~/cert/
    0 3 * * 2 scp /etc/letsencrypt/live/[域名例如ljr.im]/fullchain.pem [user2]@[PC2域名或IP]:~/cert/

INFO:申请到的https证书默认存放在/etc/letsencrypt/live/[域名例如ljr.im]/目录


3.小结

  • certbot工具的DNS方式续期证书,脚本需要做的工作是接收一个校验字符串,在DNS服务商平台上添加一条TXT类型、主机记录为_acme-challeng、值为校验字符串的记录。
  • scp免密传输,实际上是本地机器用户以远程机器用户身份登录,相关配置在这两个用户相应的用户文件夹里的.ssh文件夹进行。

参考文章传送门:

1、不会自动为Let’s Encrypt通配符证书续期?我写了个小工具