Ethan's Blog

记录和思考

使用 acme.sh 和 DNSPod 配置和自动更新 Let's Encrypt 证书

本文记录和介绍使用 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 记录下来:

生成 DNSPod API Key 和 ID

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" 即可。

此外,这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后,被再次自动调用。

相关文章: