Featured image of post 使用 LEGO 和 SystemD 自动续签证书

使用 LEGO 和 SystemD 自动续签证书

像我这种懒人怎么可能每3个月去手动续签一次

网络上大部分教程用的是 crontabacme.sh, acme.sh 我不知道怎么样,但是 systemd 和 crontab 相比,可以查看执行计划和执行日志, lego 是使用 Golang 编写的单文件 acme 客户端,多平台,开箱即用,支持多种域名服务商

安装 lego

对于 Arch Linux:

1sudo pacman -Sy lego

对于其他发行版: 前往 https://github.com/go-acme/lego/releases/latest/ 下载

获取 AccessKey (以 Aliyun 为例)

  1. 前往 RAM访问控制(https://ram.console.aliyun.com/users)
  2. 点击 创建用户,登录名称和显示名称任意,访问控制中勾选 OpenAPI 调用访问
  3. 立即保存 AccessKey IDAccessKey Secret (只会显示一次,以后无法查看)
  4. 前往 权限管理/授权
  5. 点击 新增授权授权主体 为刚刚创建的账号,选择权限选择 系统策略 里的 AliyunDNSFullAccess,点击确定

Tips: AccessKey IDAccessKey Secret 要严格保密,以防泄露

签发证书

其他服务商配置请参考: https://go-acme.github.io/lego/dns/

  1. 创建证书存储文件夹:

    1sudo mkdir -p /usr/share/lego
    
  2. 申请证书

    • line 2-3 填写 AccessKey
    • line 5 替换成自己的邮箱
    • line 9 替换成自己的域名
    1sudo LEGO_PATH=/usr/share/lego \
    2ALICLOUD_ACCESS_KEY=<AccessKey ID> \
    3ALICLOUD_SECRET_KEY=<AccessKey Secret> \
    4/usr/bin/lego --accept-tos \
    5  --email user@example.com \
    6  --dns alidns \
    7  # 如果要申请通配符证书,取消下行注释 \
    8  #-d "*.example.com" \
    9  -d "example.com" run
    
  3. 给予可访问权限

    1sudo chmod 755 /usr/share/lego/certificates
    2sudo chmod 644 /usr/share/lego/certificates/*
    
  4. 查看证书信息:

    1sudo cat /usr/share/lego/certificates/_.example.com.crt | \
    2openssl x509 -noout -text
    

创建续签脚本

  1. 编辑 /usr/share/lego/renew.sh

    • line 3-4 填写 AccessKey
    • line 6 替换成自己的邮箱
    • line 9 替换成自己的域名
     1#!/bin/bash
     2LEGO_PATH=/usr/share/lego \
     3ALICLOUD_ACCESS_KEY=<AccessKey ID> \
     4ALICLOUD_SECRET_KEY=<AccessKey Secret> \
     5/usr/bin/lego --accept-tos \
     6  --email user@example.com \
     7  --dns alidns \
     8  #-d "*.example.com" \
     9  -d "example.com" renew
    10
    11# 如果有同账号下的多个域名可追加以下内容,不同账号请创建新文件
    12/usr/bin/lego --accept-tos \
    13  --email user@example.com \
    14  --dns alidns \
    15  -d "example2.com" renew
    16
    17# 如果要顺便让 Nginx 重载证书:
    18nginx -s reload
    

    Tips: 此脚本无论续签是否成功都会重载 Nginx,官方提供了 --renew-hook="./myscript.sh" 参数可在仅成功时运行,但是需要单独写一个脚本,下面是示例:

    1. 编辑 /usr/share/lego/hook.sh

      1#!/bin/bash
      2nginx -s reload
      
    2. 修改权限

      1sudo chmod 700 /usr/share/lego/hook.sh
      
    3. 编辑 /usr/share/lego/renew.shline 9

      1  -d "example.com" renew --renew-hook="/usr/share/lego/hook.sh"
      
  2. 修改权限,防止 AccessKey 泄露

    1sudo chmod 700 /usr/share/lego/renew.sh
    
  3. 运行测试

    1sudo /usr/share/lego/renew.sh
    

编写 service/timer 文件

service 文件

  • 编辑 /etc/systemd/system/task-lego-renew.service
1[Unit]
2Description=Lego Renew
3
4[Service]
5ExecStart=/usr/share/lego/renew.sh

timer

  • 编辑 /etc/systemd/system/task-lego-renew.timer
  • line 5 含义:将在每周日凌晨 04:00 运行
1[Unit]
2Description=Timer - Lego Renew
3
4[Timer]
5OnCalendar=Sun *-*-* 04:00:00
6Unit=task-lego-renew.service
7
8[Install]
9WantedBy=timers.target

启动

1sudo systemctl daemon-reload
2sudo systemctl enable --now task-lego-renew.timer

任务计划查询查询

1systemctl status task-lego-renew.timer

日志查询

1journalctl -e -u task-lego-renew
CC BY-NC-SA 4.0 转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!
最后更新于 Apr 28, 2023 02:38 +0800
人最重要的特点是会思考,写博客的初衷是保存思维的电子快照。 当然各种文档工具亦或是简单的文本编辑器也能随时记录点滴,选择建个人网站无非是想满足技术爱好者的偏执。
Built with Hugo
主题 StackJimmy 设计