0%

acme.sh自动更新SSL证书

1. 证书类型

  • 目前主流的SSL证书主要分为DV SSL(域名型) 、 OV SSL(组织型) 、EV SSL(增强型)。

1

  • DV、OV、EV证书在浏览器中显示的区别

DV类型仅在浏览器显示一个小锁,OV和EV类型证书都包含了企业名称信息,但是,EV证书采用了更加严格的认证标准,浏览器在访问时,会在地址栏显示公司名称,地址栏变成绿色。绿的更加让人信任。

1

2. ACME协议

ACME全称The Automatic Certificate Management Environment,而acme.sh这个库,则能够在Linux上实现如下功能:

  1. 自动向Let’s Encrypt申请证书;
  2. 自动调用各大云平台的api接口实现TXT解析配置;
  3. 证书下发后自动部署到nginx;
  4. 利用定时器,每60天自动更新证书,并完成自动部署。

3. 配置证书

3.1 安装acme.sh

1
curl https://get.acme.sh | sh

这个自动安装过程完成了以下几个步骤:

  1. 拷贝sh脚本到~/.acme.sh/
  2. 创建alias别名acme.sh=~/.acme.sh/acme.sh (source ~/.bashrc一下)
  3. 启动定时器 . 可以通过crontab -l查看

3.2 dns验证并安装部署

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证. 接下来我们说下 dns的验证.

  • 去阿里的控制台找到Ali_Key, Ali_Secret, 执行下面命名

    1
    2
    export Ali_Key="xxxxxxxx" 
    export Ali_Secret="xxxxxxxx"
  • 生成泛域名证书

    1
    acme.sh --issue -d "*.liuvv.com" --dns dns_ali

    ~/.acme文件里生成了*.liuvv.com 文件夹

  • 配置nginx

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    server {
    listen 80 default_server;
    listen [::]:80 default_server;
    rewrite ^ https://$http_host$request_uri? permanent; #https跳转到https,永久重定向
    }

    server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    ssl_certificate "/etc/nginx/ssl/fullchain.cer";
    ssl_certificate_key "/etc/nginx/ssl/*.liuvv.com.key";

    root /home/levonfly/www;
    index index.html;
    }
  • 安装证书

    1
    2
    3
    4
    sudo ./acme.sh  --installcert  -d  *.liuvv.com   \
    --key-file /etc/nginx/ssl/*.liuvv.com.key \
    --fullchain-file /etc/nginx/ssl/fullchain.cer \
    --reloadcmd "service nginx force-reload"
    • 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload
    • nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
  • 重新生成证书

    1
    sudo ./acme.sh --renew -d *.liuvv.com --force

    通过这个命令,观看是否自动部署, 并观察证书的到期时间.

3.3 本机快速验证

1
2
3
4
5
6
7
8
9
10
# 查看所有的证书列表
acme.sh --list

# 关一下nginx,保证80端口 不被占用
docker stop nginx
acme.sh --issue -d grafana.liuwei.xyz --standalone
docker start nginx

# 删除证书
acme.sh --remove -d grafana.liuwei.xyz
  • nginx 相关
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
# 使用docker 查看配置有效性
docker exec -it nginx nginx -t

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name grafana.liuwei.xyz;

location / {
sendfile off;

proxy_pass http://xxx:8892;
proxy_redirect default;
proxy_http_version 1.1;

proxy_set_header Connection "Upgrade";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_max_temp_file_size 0;

client_max_body_size 10m;
client_body_buffer_size 128k;

proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_request_buffering off; # Required for HTTP CLI commands
}

ssl_certificate /root/.acme.sh/grafana.liuwei.xyz_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/grafana.liuwei.xyz_ecc/grafana.liuwei.xyz.key;
}

4. 使用

4.1 操作

1
2
3
4
5
6
7
8
9
10
11
cd /root/.acme.sh
# 1.先停掉 nginx,因为下面 standalone 会占用 80 端口
docker stop nginx

# 2. 生成生成
acme.sh --issue --standalone -d dev.abc.ai

# 3. 修改 nginx 配置文件

# 4. 重启
docker start nginx

5. 参考资料

可以加首页作者微信,咨询相关问题!