1. 官方文档
  2. 安装
  3. 生成证书
  4. nginx 安装证书
  5. 更换证书 Server
  6. 使用计划任务自动更新
  7. 升级
  8. 其他命令
  9. 问题
  10. 参考

acme.sh 使用笔记

acme.sh 是一个HTTS SSL 证书自动获取、更新工具,本文记录了该工具的部分命令使用方式。

官方文档

GitHub - acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol

安装

1
2
3
4
5
apt install git -y

git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m my@example.com

生成证书

直接生成

1
2
3
4
5
apt install socat

// 生成证书需要使用 80 端口,注意端口占用
systemctl stop caddy
/root/.acme.sh/acme.sh --issue -d example.com -d www.example.com --standalone

强制更新证书

1
/root/.acme.sh/acme.sh --issue -d example.com  -d www.example.com --standalone --force

nginx 安装证书

生成证书

1
2
3
acme.sh  --issue  -d example.com  --nginx
// or 强制更新
acme.sh --issue -d example.com --nginx --force

安装证书(acme.sh不建议直接使用 .acme.sh 文件夹里的证书)

1
2
3
4
5
mkdir /root/example.com
acme.sh --install-cert -d example.com \
--key-file /root/cert/example.com/key.pem \
--fullchain-file /root/cert/example.com/cert.pem \
--reloadcmd "nginx -s reload"

修改 nginx 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
http {
server {
listen 80;
listen 443;
server_name example.com;
charset utf-8;
ssl on;
#ssl证书的pem文件路径
ssl_certificate /root/cert/example.com/cert.pem;
#ssl证书的key文件路径
ssl_certificate_key /root/cert/example.com/key.pem;
}
}

更换证书 Server

https://github.com/acmesh-official/acme.sh/wiki/Server
默认使用 zerossl

1
acme.sh --set-default-ca --server zerossl

使用 letsencrypt

1
acme.sh --set-default-ca --server letsencrypt

使用计划任务自动更新

仅需要配置定时任务即可,acme.sh 会自动记录执行过的命令。

1
2
3
crontab  -l

56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

升级

1
acme.sh --upgrade

其他命令

查看证书列表 acme.sh --list
停止自动更新 acme.sh --remove -d example.com [--ecc]
查看、测试nginx 配置 nginx -t
查看nginx进程 ps -ef | grep nginx
kill nginx进程 kill -9 <pid>

问题

1 Please install socat tools first.
安装 socat

1
apt install socat

2 timeout 超时

设置超时时间 export MAX_RETRY_TIMES=9999

3 Can not find conf file for domain example.com

修改nginx配置,添加 server_name example.com;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
http {
server {
server_name example.com;
}
}
``````

4 Verify error:"error":
使用 --debug 2 重新执行命令

根据日志发现,报错的原因是无法访问nginx 的 .well-known/acme-challenge/ 路径

查看并修改 nginx 配置

before
```conf
http {
server {
listen 80;
location / {
// root ...
}
}
}

after

1
2
3
4
5
6
7
8
9
http {
server {
listen 80;
listen 443;
location / {
// root ...
}
}
}

原因是如果没配置 80 端口,nginx 访问的不是 location root 中的文件夹
debug 模式不会自动删除 .well-known/acme-challenge/ 中的文件,可以将复制链接到浏览器里试试能不能正常访问

参考

用acme.sh帮你免费且自动更新的HTTPS证书,省时又省力 - 知乎