网络上大部分教程用的是 crontab 和 acme.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 为例)
- 前往 RAM访问控制(https://ram.console.aliyun.com/users)
- 点击 创建用户,登录名称和显示名称任意,访问控制中勾选 OpenAPI 调用访问
- 立即保存
AccessKey ID和AccessKey Secret(只会显示一次,以后无法查看) - 前往 权限管理/授权
- 点击 新增授权,
授权主体为刚刚创建的账号,选择权限选择系统策略里的AliyunDNSFullAccess,点击确定
Tips: AccessKey ID 和 AccessKey Secret 要严格保密,以防泄露
签发证书
其他服务商配置请参考: https://go-acme.github.io/lego/dns/
创建证书存储文件夹:
1sudo mkdir -p /usr/share/lego申请证书
line 2-3填写AccessKeyline 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给予可访问权限
1sudo chmod 755 /usr/share/lego/certificates 2sudo chmod 644 /usr/share/lego/certificates/*查看证书信息:
1sudo cat /usr/share/lego/certificates/_.example.com.crt | \ 2openssl x509 -noout -text
创建续签脚本
编辑
/usr/share/lego/renew.shline 3-4填写AccessKeyline 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 reloadTips: 此脚本无论续签是否成功都会重载 Nginx,官方提供了
--renew-hook="./myscript.sh"参数可在仅成功时运行,但是需要单独写一个脚本,下面是示例:编辑
/usr/share/lego/hook.sh1#!/bin/bash 2nginx -s reload修改权限
1sudo chmod 700 /usr/share/lego/hook.sh编辑
/usr/share/lego/renew.sh的line 91 -d "example.com" renew --renew-hook="/usr/share/lego/hook.sh"
修改权限,防止
AccessKey泄露1sudo chmod 700 /usr/share/lego/renew.sh运行测试
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
