本文记录和介绍使用 acme.sh 和 DNSPod 的 API 通过 DNS 验证的方式来配置和自动更新 Let’s Encrypt 免费证书。
1. 安装 acme.sh
安装 acme.sh 非常简单,可以使用 root 用户也可以使用普通用户安装,简单使用以下命令即可:
curl https://get.acme.sh | sh
安装完成后,可执行文件在当前用户目录下 ~/.acme.sh/ ,我们给这个 bash 设定一个 alias,方便使用:
alias acme.sh=~/.acme.sh/acme.sh
2. 生成 DNSPod API Key 和 ID
登陆自己的 DNSPod 帐户,点击自己头像,选择密钥管理,添加一个密钥,将 ID 和 Token 记录下来:
3. 签发证书
3.1 配置环境变量
首先为 acme.sh 配置环境变量,在服务器上输入以下代码:
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
注意替换自己的 DNSPod API Key 和 ID。
3.2 签发证书
acme.sh --issue --dns dns_dp -d ethanblog.com -d *.ethanblog.com
以上命令为 ethanblog.com 签发了主域名和泛域名证书,并且自动添加了 crontab 定期任务,每天 0:00 自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。
3.3 更新证书
目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心。
4. 安装证书
签发的证书默认存储在安装目录下: ~/.acme.sh/,建议不要直接使用此目录下的文件,例如:不要直接让 nginx/apache 的配置文件使用这下面的文件。这里面的文件都是内部使用,而且目录结构可能会变化。
正确的使用方法是使用 –installcert 命令,并指定目标位置,然后证书文件会被 copy 到相应的位置,例如:
acme.sh --installcert -d ethanblog.com \
--cert-file /home/docker/web/nginx/ssl/ethanblog.com/chain.pem \
--key-file /home/docker/web/nginx/ssl/ethanblog.com/privkey.pem \
--fullchain-file /home/docker/web/nginx/ssl/ethanblog.com/fullchain.pem \
--reloadcmd "docker container restart 2f0e2bb"
需要注意的是最后指定 reloadcmd,当证书更新以后,reloadcmd 会被自动调用,让服务器生效。以上示例为重启了 nginx 的 docker。如果是 Apache 或者 nginx,分别使用 --reloadcmd "service apache2 force-reload"
或 --reloadcmd "service nginx force-reload"
即可。
此外,这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后,被再次自动调用。