Applying_for_an_SSL_Certificate

如何简单快速地申请ssl证书

申请ssl证书的工具有很多, 网上的教程五花八门, 例如常见的 acme.sh

acme.sh 之前用过, 体验并不是很好

  1. 安装需要clone github仓库
  2. 文档在仓库的wiki, 看起来不方便
  3. 默认安装的路径不显眼, 在 ~/.acme.sh 下
  4. 迁移到新服务器后, 原来的配置失效了, 不知道是什么原因

当然我也试过 nginx proxy manage 里的自动申请

但该工具也是问题一堆, 例如

  1. 内部依赖有问题, 报错竟然是需要下载旧版本, 然后进容器内降级某个组件
  2. 似乎依赖某个被墙的地址, 访问不了的情况下, 重启容器, 会进不了主页, 报错网关错误, 添加代理才行
  3. 维护似乎不够频繁, 上次进项目有几千个未关闭的issues

后面在v2ex看到有人推荐 lego, 使用起来体验非常好

  1. 是用go写的, 主体就一个二进制, 不需要特定的安装路径
  2. 文档写得很简单, 用法一看就懂
  3. 证书生成的位置可以手动指定, 有自动重启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
build with Hugo, theme Stack, visits 0