如何简单快速地申请ssl证书
申请ssl证书的工具有很多, 网上的教程五花八门, 例如常见的 acme.sh
但 acme.sh
之前用过, 体验并不是很好
- 安装需要clone github仓库
- 文档在仓库的wiki, 看起来不方便
- 默认安装的路径不显眼, 在 ~/.acme.sh 下
- 迁移到新服务器后, 原来的配置失效了, 不知道是什么原因
当然我也试过 nginx proxy manage
里的自动申请
但该工具也是问题一堆, 例如
- 内部依赖有问题, 报错竟然是需要下载旧版本, 然后进容器内降级某个组件
- 似乎依赖某个被墙的地址, 访问不了的情况下, 重启容器, 会进不了主页, 报错网关错误, 添加代理才行
- 维护似乎不够频繁, 上次进项目有几千个未关闭的issues
后面在v2ex看到有人推荐 lego
, 使用起来体验非常好
- 是用go写的, 主体就一个二进制, 不需要特定的安装路径
- 文档写得很简单, 用法一看就懂
- 证书生成的位置可以手动指定, 有自动重启nginx的钩子
下面以申请一个dns托管在cloudflare的域名为例:
ps: 开启小云朵的域名cloudflare会自动申请, 但像ddns ipv6直连 家里的设备, 还是得自己申请.
首次申请
需要先到cloudflare开启api token, 这里的是区域token,不需要全局api
创建一个 create.sh
, 位置按自己喜欢
1
2
3
4
5
6
7
8
9
10
11
12
| #!/bin/sh
cd /root/app/lego
echo '开始申请'
export CLOUDFLARE_EMAIL="这是邮箱"
export CLOUDFLARE_DNS_API_TOKEN="这是token"
./lego --email="这是邮箱" \
--dns=cloudflare \
--domains="1234.com" \
--domains="*.1234.com" \
--path="/root/app/lego/" \
run
echo "申请结束"
|
替换下真实信息, 给下执行权限, 手动运行下就行了
成功后生成的证书在 certificates
里, 直接在 nginx 使用
如果网络有问题, 可能需要设置下代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #!/bin/sh
cd /root/app/lego
export http_proxy="http://127.0.0.1:7890"
export https_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
echo '开始申请'
export CLOUDFLARE_EMAIL="这是邮箱"
export CLOUDFLARE_DNS_API_TOKEN="这是token"
./lego --email="这是邮箱" \
--dns=cloudflare \
--domains="1234.com" \
--domains="*.1234.com" \
--path="/root/app/lego/" \
run
echo "申请结束"
|
续签
创建一个 renew.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #!/bin/sh
cd /root/app/lego
export http_proxy="http://127.0.0.1:7890"
export https_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
echo '开始续签'
export CLOUDFLARE_EMAIL="这是邮箱"
export CLOUDFLARE_DNS_API_TOKEN="这是token"
./lego --email="这是邮箱" \
--dns=cloudflare \
--domains="1234.com" \
--domains="*.1234.com" \
--path="/root/app/lego/" \
renew \
--renew-hook="./myscript.sh"
echo "续签结束"
|
后面有个 myscript.sh
这是续签成功后自动重启nginx的钩子
自动重启nginx
创建 myscript.sh
1
2
| #!/bin/sh
nginx -s reload
|
定时执行
直接 crtontab -e
每七天执行一次renew.sh
整合成一个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| #!/bin/sh
# 域名配置
DOMAIN="1234.com"
EMAIL="这是邮箱"
TOKEN="这是token"
# 清理环境变量
cleanup_env() {
unset CLOUDFLARE_EMAIL
unset CLOUDFLARE_DNS_API_TOKEN
unset http_proxy
unset https_proxy
unset no_proxy
}
# 通用配置
setup_env() {
cd /root/app/lego
export http_proxy="http://127.0.0.1:7890"
export https_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
export CLOUDFLARE_EMAIL="$EMAIL"
export CLOUDFLARE_DNS_API_TOKEN="$TOKEN"
}
# 申请证书
create() {
echo '开始申请'
setup_env
./lego --email="$EMAIL" \
--dns=cloudflare \
--domains="$DOMAIN" \
--domains="*.$DOMAIN" \
--path="/root/app/lego/" \
run
cleanup_env
echo "申请结束"
}
# 续签证书
renew() {
echo '开始续签'
setup_env
./lego --email="$EMAIL" \
--dns=cloudflare \
--domains="$DOMAIN" \
--domains="*.$DOMAIN" \
--path="/root/app/lego/" \
renew \
--renew-hook="nginx -s reload"
cleanup_env
echo "续签结束"
}
# 根据参数执行不同操作
case "$1" in
"create")
create
;;
"renew")
renew
;;
*)
echo "用法: $0 {create|renew}"
exit 1
;;
esac
|