acme.sh 是开源项目,实现了 ACME 协议,可以从 Let’s Encrypt 生成免费证书,配合 cronjob 实现自动化部署。
现在的免费证书需要 3 个月一刷新,即使是买的证书,一次性买多年也要一年一更换,acme.sh 很好地解决了这个问题。尝试把博客移到阿里云 ECS,云小站 99 元可以搞一个 2C2G/40GSSD/3M 带宽的 ECS,还是非常合适的。
以下都以域名 tiaobug.com 和 www.tiaobug.com 为例。root 或 non-root 用户都可以安装。
安装 acme.sh
1 | curl https://get.acme.sh | sh -s email=i@tiaobug.com # 改成自己的邮箱 |
脚本中间会访问 GitHub,如果访问有困难,可以用 Gitee 镜像:
1 | git clone https://gitee.com/neilpang/acme.sh.git |
安装后会自动增加定时任务用于刷新证书:
1 | # crontab -l |
安装过程不会修改系统文件,所有改动都在 ~/.acme.sh/ 中,删除也很容易。
验证域名
acme.sh 生成证书前需要验证域名所有权,支持 HTTP 文件访问和 DNS TXT 解析两种方式,选一种即可。
DNS TXT 解析验证
在阿里云 ECS 条件下 HTTP 验证更简单。DNS 验证的好处是不需要服务器和公网 IP,只需 DNS 解析记录;坏处是不配置 Automatic DNS API 的话无法自动续期,每次都要手动重新解析。
1 | acme.sh --issue --dns -d tiaobug.com -d www.tiaobug.com --yes-I-know-dns-manual-mode-enough-go-ahead-please |
acme.sh 会生成相应的 TXT 记录,在域名管理面板添加后,等待解析完成,重新生成证书(注意第二次用 --renew):
1 | acme.sh --renew -d tiaobug.com -d www.tiaobug.com --yes-I-know-dns-manual-mode-enough-go-ahead-please |
DNS 方式的强大之处在于可以用域名解析商的 API 自动添加 TXT 记录。acme.sh 支持 Cloudflare、DNSPod、Godaddy、OVH 等数十种解析商。
以 DNSPod 为例:
1 | export DP_Id="1234" |
API ID 和 Key 会被自动记录,以后直接生成即可:
1 | acme.sh --issue -d mydomain2.com --dns dns_dp |
更详细的 API 用法:dnsapi/README.md
HTTP 文件访问验证(推荐)
预先在 Nginx 里配置 80 服务,让域名可以访问:
1 | server { |
执行验证:
1 | acme.sh --issue -d tiaobug.com -d www.tiaobug.com --webroot /home/tiaobug/web-sites/tiaobug.com/ |
完成后证书路径类似:
1 | Your cert is in: /root/.acme.sh/tiaobug.com_ecc/tiaobug.com.cer |
acme.sh 会自动生成验证文件放到网站根目录,验证完成后删除,不用担心泄露。
还提供 Nginx / Apache 封装工具(未测试):
1 | acme.sh --issue -d tiaobug.com -d www.tiaobug.com --apache |
如果 80 端口空闲,还可以 standalone 模式临时监听:
1 | acme.sh --issue -d tiaobug.com -d www.tiaobug.com --standalone |
生成并安装证书
1 | mkdir -p /home/tiaobug/ssl/tiaobug.com/ |
注意用的是 service nginx force-reload,不是 reload——reload 不会重新加载证书。
如果不指定 --key-file 和 --fullchain-file,默认证书放在 ~/.acme.sh/,尽量不要直接使用。
--install-cert 可以指定目标文件和 reloadcmd,证书更新后自动调用让服务器生效。详细参数:Install cert to apache/nginx
查看已安装证书
1 | acme.sh --info -d www.tiaobug.com |
配置 Nginx HTTPS
1 | server { |
ssl_certificate 和 ssl_certificate_key 一定要指向正确文件,cert 和 key 不要搞反。配置完成后 nginx -s reload 重启即可。
证书自动更新
目前证书 60 天后会自动更新,cronjob 代劳,无需手动操作。
acme.sh 自身更新
1 | acme.sh --upgrade |
开启自动升级:
1 | acme.sh --upgrade --auto-upgrade |
关闭自动升级:
1 | acme.sh --upgrade --auto-upgrade 0 |