acme.sh 自动化配置证书,永久免费 SSL

acme.sh 是开源项目,实现了 ACME 协议,可以从 Let’s Encrypt 生成免费证书,配合 cronjob 实现自动化部署。

现在的免费证书需要 3 个月一刷新,即使是买的证书,一次性买多年也要一年一更换,acme.sh 很好地解决了这个问题。尝试把博客移到阿里云 ECS,云小站 99 元可以搞一个 2C2G/40GSSD/3M 带宽的 ECS,还是非常合适的。

以下都以域名 tiaobug.comwww.tiaobug.com 为例。root 或 non-root 用户都可以安装。

安装 acme.sh

1
curl https://get.acme.sh | sh -s email=i@tiaobug.com  # 改成自己的邮箱

脚本中间会访问 GitHub,如果访问有困难,可以用 Gitee 镜像:

1
2
3
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m i@tiaobug.com

安装后会自动增加定时任务用于刷新证书:

1
2
# crontab -l
24 21 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

安装过程不会修改系统文件,所有改动都在 ~/.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
2
3
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d tiaobug.com -d www.tiaobug.com

API ID 和 Key 会被自动记录,以后直接生成即可:

1
acme.sh --issue -d mydomain2.com --dns dns_dp

更详细的 API 用法:dnsapi/README.md

HTTP 文件访问验证(推荐)

预先在 Nginx 里配置 80 服务,让域名可以访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
listen [::]:80;

server_name tiaobug.com www.tiaobug.com;

root /home/tiaobug/web-sites/tiaobug.com/;
index index.html;

location / {
try_files $uri $uri/ =404;
}
}

执行验证:

1
acme.sh --issue -d tiaobug.com -d www.tiaobug.com --webroot /home/tiaobug/web-sites/tiaobug.com/

完成后证书路径类似:

1
2
3
4
Your cert is in: /root/.acme.sh/tiaobug.com_ecc/tiaobug.com.cer
Your cert key is in: /root/.acme.sh/tiaobug.com_ecc/tiaobug.com.key
The intermediate CA cert is in: /root/.acme.sh/tiaobug.com_ecc/ca.cer
And the full-chain cert is in: /root/.acme.sh/tiaobug.com_ecc/fullchain.cer

acme.sh 会自动生成验证文件放到网站根目录,验证完成后删除,不用担心泄露。

还提供 Nginx / Apache 封装工具(未测试):

1
2
acme.sh --issue -d tiaobug.com -d www.tiaobug.com --apache
acme.sh --issue -d tiaobug.com -d www.tiaobug.com --nginx

如果 80 端口空闲,还可以 standalone 模式临时监听:

1
acme.sh --issue -d tiaobug.com -d www.tiaobug.com --standalone

生成并安装证书

1
2
3
4
5
mkdir -p /home/tiaobug/ssl/tiaobug.com/
acme.sh --install-cert -d tiaobug.com -d www.tiaobug.com \
--key-file /home/tiaobug/ssl/tiaobug.com/key.pem \
--fullchain-file /home/tiaobug/ssl/tiaobug.com/cert.pem \
--reloadcmd "service nginx force-reload"

注意用的是 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl;
listen [::]:443 ssl;

server_name tiaobug.com www.tiaobug.com;

root /home/tiaobug/web-sites/tiaobug.com/;
index index.html;
ssl_certificate "/home/tiaobug/ssl/tiaobug.com/cert.pem";
ssl_certificate_key "/home/tiaobug/ssl/tiaobug.com/key.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;

location / {
try_files $uri $uri/ =404;
}
}

ssl_certificatessl_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
Notice: 正常情况下,这里会有一个基于utteranc.es的留言系统,如果看不到,可能要想想办法才能看到。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2012 - 2026 tiaobug.com All Rights Reserved.

鲁ICP备2024124237号-1