文章目录
前言
现在证书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 ID 和 AccessKey Secret ,然后在 VPS 输入:
export Ali_Key="你的AccessKey_ID"
export Ali_Secret="你的AccessKey_Secret"
2. DNS 是 腾讯云 / DNSPod: 登录 - 腾讯云 获取你的 DP_Id 和 DP_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的状态,但是这个证书一直在做重复性的工作,太麻烦,还是全自动去吧。