前言

本文主要记录如何使用开源项目acme.sh 来自动化我们网站的证书续期.

本文采用的方式: DNS 验证 如需其他方式请看官方文档

域名解析提供商: cloudflare 所以需要它的注册邮箱和Global API Key或者某域名下的区域 ID和户 ID

由于网上已有类似内容(但质量,不好说),故本文尽可能表述清晰,易懂,易操作.手把手帮助大家进行相关操作.

安装

1
2
3
curl https://get.acme.sh | sh -s [email protected] # 邮箱填你CF注册的就行
source ~/.zshrc
acme.sh -h # 命令应该就行正常运行了

获取令牌

使用全局 API 密钥

登录到您的 Cloudflare 帐户以获取您的API 密钥.

注意⚠️:生成的令牌不会存储在 cloudflare 帐户中,故你需要存储到安全的地方.另外,注意过期时间的设置,建议永久但要确保存储位置安全以及及时删除剪贴板中的密钥(某些程序和APP会读取剪贴板)等.

image-20230310195514768

1
2
3
export CF_Key="*****"	# 上面获取到的Key
export CF_Email="[email protected]**.com" # 上面的注册邮箱
# 在执行颁发证书命令后上面内容会被保存到~/.acme.sh/account.conf中

注意清除命令的历史记录(建议定期清除).

1
2
3
4
bash
history -c && history -w
zsh
history -c

或者暴力方式:rm ~/.bash_history && rm ~/.zsh_history

使用区域API令牌

此方法不做详细介绍,可以查看官方介绍如何使用 DNS API

令牌当前需要在所有区域中访问对 Zone.Zone 的读取访问权限和对 Zone.DNS 的写入访问权限。有关详细信息,请参阅问题 #2398

生成并安装证书

本文采用的是DNS验证方式,如需http方式请看官方文档.

1
acme.sh --issue --dns dns_cf -d example.com -d www.example.com 

例如:

image-20230310203147560

证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件,因为目录结构可能会变化.

Apache example:

1
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"

Nginx example:

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"

注意⚠️,运行命令之前,请先检查路径是否存在,否则请运行命令 mkdir -p yourpath(你的路径)

其余相关命令

查看已安装证书信息

1
acme.sh --info -d example.com

更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

请确保 cronjob 正确安装, 看起来是类似这样的:

1
2
3
crontab  -l

56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

更新 acme.sh

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.

升级 acme.sh 到最新版 :

1
acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级:

1
acme.sh --upgrade --auto-upgrade

之后, acme.sh 就会自动保持更新了.

你也可以随时关闭自动更新:

1
acme.sh --upgrade --auto-upgrade  0

出错怎么办:

如果出错, 请添加 debug log:

1
acme.sh --issue  .....  --debug 

或者:

1
acme.sh --issue  .....  --debug  2

请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh

最后, 本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面.

https://github.com/Neilpang/acme.sh/wiki