acme.sh 与 Letsencrypt

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。
我将分享我个人使用 acme.sh 的 DNS API 模式生成通配符证书并安装至 Nginx 的全过程。

安装 acme.sh

1
curl https://get.acme.sh | sh

安装脚本会自动设置 alias 方便使用。
zsh 用户也许可能大概需要手动设置 alias。

1
2
# 直接编辑 ~/.zshrc,或者其他方法
alias acme.sh='~/.acme.sh/acme.sh'

生成 letsencrypt 证书

强烈建议使用 DNS API 模式,支持列表详见 此处
我使用的是 cloudflare 的 DNS 服务,其他 DNS 提供商是否支持以及操作方式自行参考上面的两个链接,基本上主流 DNS 全部支持 API。
不支持的话考虑更换 DNS 吧,cloudflare 就是很好的选择。

获取 API Key

  • 访问 cloudflare 面板
  • 点击 API Keys 选项卡内 Global API Key 选项的 View 按钮取得 API key。
1
2
export CF_Key="你的 cloudflare Global API Key"
export CF_Email="你的 cloudflare 注册邮箱"

制作证书

我这里选择了 384 位 通配符 ECC 证书并开启 OCSP Must-Staple。也可以选择 256 位即使用 ec-256 参数,更多参数说明点击 这里Options and Params 查看。

1
acme.sh --issue --dns dns_cf -d your.domain -d '*.your.domain' -k ec-384 --ocsp

安装证书到 Nginx

这一步并不是必须,你可以手动复制或者直接引用原始证书地址,确保安全即可。

acme.sh 内置 --installcert 命令,使用说明 在此。这里假设你的 Nginx ssl 配置证书的路径为 /path/to/ecc,那么命令如下。

1
2
3
4
5
6
7
mkdir -p /path/to/ecc
# --ecc ECC 证书需要添加此参数,RSA 证书请忽略,两者路径并不相同。
# --reloadcmd 为 Nginx 重启或重载命令,请依据你自己的设置。
acme.sh --installcert --ecc -d your.domain \
--key-file /path/to/ecc/your.doamin.key \
--fullchain-file /path/to/ecc/fullchain.cer \
--reloadcmd "service nginx restart"

证书签发的限制

不要在短时间内高频率地签发证书,letsencrypt 是有着严格限制的。
感兴趣可以访问 官方声明了解详情。