skip to content
akary's Blog

acme.sh生成免费的证书

/ 5 min read

1. 安装 acme.sh

  • 安装很简单,一条命令(国外):
curl https://get.acme.sh | sh -s email=my@example.com

或者

wget -O - https://get.acme.sh | sh -s email=my@example.com
  • 通过gitee(国内)
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
  • (可选) 创建 一个 shellalias,例如 .bashrc,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
  • 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。
crontab -l

2. 获取API Token

由于acme.sh对域名解析/提供商的支持十分广泛,所以请针对自己所在的域名提供商获取对应的API Token。 支持列表:点我跳转

  • 腾讯的DNSPod

    • 登录DNSPod,进入顶部导航栏里的用户中心,在左侧的导航栏里,找到安全设置,看到页面的最下面,有个API Token.点击查看->创建API Token->填写Tokens名称,复制好IDToken即可.保存待用。
  • 阿里云域名

  • 获取到对应的API Token之后我们需要将id和key设置为环境变量,供acme.sh调用:

    # DNSPod
    export DP_Id="你的 API ID"
    export DP_Key="你的 Token"
    # aliyun
    export Ali_Key="你的 AccessKey ID"
    export Ali_Secret="你的 AccessKey Secret"

    如果你的域名提供商不是DNSPod或者阿里云,其他域名提供商变量名一览表:变量名一览表

    临时环境变量只需配置这一次即可,当成功申请证书后,API 信息会被自动保存在~/.acme.sh/account.conf里,下次你使用acme.sh的时候系统会自动读取并使用。

3.生成证书

  • 修改默认 CA
    • acme.sh 脚本默认 CA 服务器是 ZeroSSL,有时可能会导致获取证书的时候一直出现:Pending,The CA is processing your order,please just wait.

只需要把 CA 服务器改成 Let’s Encrypt 即可,虽然更改以后还是有概率出现 pending,但基本 2-3 次即可成功

acme.sh --set-default-ca --server letsencrypt
  • 自动验证(DNS API)
# DNSPod
cd ~/.acme.sh/
# 或者 alias acme.sh=~/.acme.sh/acme.sh
acme.sh --issue --dns dns_dp -d example.com -d *.example.com
# 多个域名只需要"-d 你的域名"即可
# aliyun
cd ~/.acme.sh/
# 或者 alias acme.sh=~/.acme.sh/acme.sh
acme.sh --issue --dns dns_ali -d example.com -d *.example.com

4.安装证书到 Nginx服务

证书生成好以后,我们需要把证书复制给对应的Nginx服务器去使用。

必须使用 --install-cert 命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/ 目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。

Nginx 示例:

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 reload"
  • key-file证书的key存放路径

  • fullchain-file 证书的cer存放路径

  • reloadcmd 重装nginx命令,需要适当调整比如nginx -s reload

Nginx 的配置项 ssl_certificate 需要使用 fullchain.cer ,而非 <domain>.cer ,否则 SSL Labs 的测试会报证书链问题(Chain issues Incomplete)。 默认情况下,证书每 60 天更新一次(可自定义)。更新证书后,Nginx 服务会通过 reloadcmd 传递的命令自动重载配置。

5. 更新证书

目前证书每 60 天自动更新,你无需任何操作。

但是你也可以强制续签证书:

acme.sh --renew -d example.com --force

出错怎么办

如果出错,请添加 —debug 参数输出详细的调试信息:

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

或者输出更详细的信息:

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

报错参考

链接

安装-acmesh