超级简单通过acme.sh实现证书自动续签

前言

现在证书90天需要续签仍然比较麻烦,尤其是本来工作就很忙,时不时收到域名服务商的短信等续签通知更是烦躁,还是决定使用 acme.sh 来完成全托管的证书续签。

步骤

第一步:安装 acme.sh

登录到你的 VPS,执行以下命令安装 acme.sh(将邮箱替换为你的真实邮箱,用于接收证书过期提醒):

curl https://get.acme.sh | sh -s [email protected]

安装完成后,为了让系统能直接识别 acme.sh 命令,重新加载一下环境变量(或者直接断开 SSH 重新连接):

source ~/.bashrc

如果是zsh,就输入 zsh 重载

第二步:将默认 CA 切换为 Let's Encrypt

acme.sh 目前默认的证书提供商是 ZeroSSL,虽然也不错,但在某些老旧设备上兼容性不如 Let's Encrypt。建议切换到 Let's Encrypt:

acme.sh --set-default-ca --server letsencrypt

第三步:配置 DNS API(关键)

acme.sh 需要通过你的 DNS 服务商的 API,自动在你的域名下添加一条 TXT 记录来证明你拥有这个域名。

你需要去你的域名解析服务商后台,申请 API Key 或 Token。

1. DNS 是 阿里云 (Aliyun): 阿里云登录页 获取你的 AccessKey IDAccessKey Secret ,然后在 VPS 输入:

export Ali_Key="你的AccessKey_ID"
export Ali_Secret="你的AccessKey_Secret"

2. DNS 是 腾讯云 / DNSPod: 登录 - 腾讯云 获取你的 DP_IdDP_Key,然后在 VPS 输入:

export DP_Id="你的DP_ID"
export DP_Key="你的DP_Key"

腾讯云有 API 密钥DNSPod Token 两个,它们都能用来申请证书,但它们在安全性上有很大的区别。原因如下:

  • 腾讯云 API 密钥 (Tencent Cloud API Key): 权限非常大。默认情况下,它可以控制你腾讯云账号下的所有资源(包括但不限于云服务器开关机、重装系统、数据库读写、买卖资源等)。除非你会配置复杂的 CAM 权限策略,否则把这个密钥明文保存在 VPS 上是非常危险的。如果 VPS 被黑,你的整个腾讯云账号都会遭殃。

  • DNSPod Token: 它的权限非常单一,只能用来修改 DNS 解析记录。这完美契合 acme.sh 只需要添加 TXT 记录来验证域名的需求。即使密钥泄漏,最坏的情况也就是域名解析被乱改,不会影响你账号里的服务器和资金安全。

因此,出于服务器安全规范(最小权限原则),首选 DNSPod Token

第四步:申请颁发证书

配置好 API 环境变量后,就可以一键申请证书了。 假设你的域名是 yourdomain.com,使用以下命令(注意把 --dns 后面的参数换成你对应的服务商):

# 阿里云用 dns_ali
acme.sh --issue --dns dns_ali -d yourdomain.com -d '*.yourdomain.com'

# DNSPod用 dns_dp
acme.sh --issue --dns dns_dp -d yourdomain.com -d '*.yourdomain.com'

💡 提示:加上 *.yourdomain.com 代表申请的是泛域名(通配符)证书,这样你的主域名和所有二级域名都可以共用这一个证书。

如果出现 Invalid status. Verification error details: During secondary validation: Incorrect TXT record 错误,是因为DNS 记录在全球各地的同步延迟,等一会儿再重新执行一下命令即可。

第五步:安装证书到 Nginx(不要省略这一步!)

注意: 默认生成的证书在 ~/.acme.sh/ 隐藏目录下。绝对不要让 Nginx 的配置文件直接指向这个目录,因为这个目录的内部结构将来可能会改变。

使用 --install-cert 命令,把证书提取到 Nginx 所在的目录(例如 /etc/nginx/ssl,如果没这个目录,自己 mkdir /etc/nginx/ssl 建一个):

acme.sh --install-cert -d yourdomain.com \
--key-file       /etc/nginx/ssl/yourdomain.com.key  \
--fullchain-file /etc/nginx/ssl/yourdomain.com.cer \
--reloadcmd     "systemctl restart nginx"

这个命令做了三件事:把私钥放好、把证书链放好、并在以后每次自动续期成功后,自动帮你重启 Nginx 生效

第六步:修改 Nginx 配置文件

最后,打开 Nginx 网站配置文件,将证书路径指向你刚刚安装的路径:

Nginx

server {
    listen 443 ssl http2;
    server_name yourdomain.com;

    # 指向第五步中的路径
    ssl_certificate      /etc/nginx/ssl/yourdomain.com.cer;
    ssl_certificate_key  /etc/nginx/ssl/yourdomain.com.key;

    # ... 其他 Nginx 配置 ...
}

保存并重启 Nginx :sudo systemctl restart nginx

所有的子域名也是指向这个证书文件!

🎉 大功告成

现在你已经在 VPS 上部署了属于你自己的 Let's Encrypt 证书。

关于自动续期: 在安装 acme.sh 的那一刻,它就已经自动帮你往系统的 crontab(计划任务)里写入了一条定时任务。 证书有效期是 90 天,acme.sh 会在第 60 天左右自动利用 API 重新验证、重新下载证书,并自动执行上面第五步里的 systemctl restart nginx 重启网页服务。

整个过程可以说是“设置一次,终身不管”了。

最后

之前很喜欢将这些手动的东西掌握在自己手里,就担心哪天vps出问题不好排查,顺带着也能够随时掌握vps的状态,但是这个证书一直在做重复性的工作,太麻烦,还是全自动去吧。

0 0 投票数
文章评分
订阅评论
提醒
guest

1 评论
最旧
最新 最多投票
滚动至顶部
1
0
希望看到您的想法,请您发表评论x