Use acme.sh to get certificate

Install from web

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

Example for Tencent Cloud (DNSPod)

  1. click to generate secret key
  2. use this script to get cert and add hook when certificate has renewed to reload your web server
bash
1export DP_Id="1234" // get from https://console.dnspod.cn/account/token
2export DP_Key="sADDsdasdgdsf"
3acme.sh --issue --dns dns_dp -d example.com \n 
4 -d *.example.com --renew-hook "command to reload your web server"

使用 acme.sh 生成 Cloudflare 域名证书

  • 登录到你的 Cloudflare 账户,然后导航到 "Profile" -> "API Tokens"。
  • 点击 "Create Token"。
  • Use Edit zone DNS template
  • 点击 "Continue to Summary",然后点击 "Create Token"。
  • 在下一页,你将看到你的新 Token。复制并保存好这个 Token,因为一旦离开这个页面,你就无法再看到它。

然后,在你的终端里设置这个 API Token:

bash
1export CF_Token="你的 API Token"

然后你就可以使用 acme.sh 来申请 SSL 证书了:

bash
1acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com

一些相关的小事情

  • acme.sh 默认 CA 切换到 ZoreSSL
    改回到 Let's Encrypt
bash
1acme.sh --set-default-ca --server letsencrypt
  • 有时候 corncob 会失败
bash
1acme.sh --cron --home ~/.acme.sh

查看日志, 类似如下内容。

bash
1[20211214日 星期二 10:56:23 CST] ===Starting cron===
2[20211214日 星期二 10:56:23 CST] Renew: 'powerfulyang.com'
3[20211214日 星期二 10:56:23 CST] Skip, Next renewal time is: 20211224日 星期五 10:23:57 UTC
4[20211214日 星期二 10:56:23 CST] Add '--force' to force to renew.
5[20211214日 星期二 10:56:23 CST] Skipped powerfulyang.com
6[20211214日 星期二 10:56:23 CST] ===End cron===

报错 zsh: no matches found: *.yourdomain.com

遇到的问题是由于 Zsh 的 globbing 特性导致的。Zsh 默认启用了 globbing,这意味着它会尝试将 *.yourdomain.com 当做通配符去匹配本地的文件名。当没有文件匹配时,它就会报出 no matches found 的错误。

要解决这个问题,你可以在命令中使用引号来禁止 globbing:

bash
1acme.sh --issue --dns dns_cf -d yourdomain.com -d "*.yourdomain.com"

或者,你也可以临时禁止 globbing:

bash
1setopt NO_NOMATCH
2acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com
3setopt NOMATCH

这样,*.yourdomain.com 就会被正确地当做字符串处理,而不是文件名通配符。