前言
从2023年下半年开始,各大云厂商的免费证书陆续从有效期一年变成了有效期三个月,这对广大的个人用户来讲是一件很不好的事情,因为这样就意味着每三个月就需要重新申请一次证书并部署。
雷池虽然自带了一个通过 Let's Encrypt 来申请证书的功能,但只支持申请时长为3个月的免费证书,但也没有自动续签的功能,所以作者就写了一个用于自动化更新雷池SSL证书的工具。
工具介绍
这款工具使用golang编写(go语言写的多了,就没想过用其他语言了),通过 Let's Encrypt 的 DNS-01 challenge
来进行验证并申请新的证书,替换原有的证书来实现自动更新。
目前DNS验证暂时仅支持:腾讯云
、 阿里云
、 华为云
、 西部数码
、 雨云
,如果有小伙伴使用的是其他的域名服务提供商,欢迎在评论区留言,作者会在收到留言后会进行相应的更新。
项目地址:
github: https://github.com/Wink541/SafelineAPI
个人gitea: https://gitea.doicat.com/duoduo/SafelineAPI
工具使用
1. 下载项目
$ git clone https://github.com/Wink541/SafelineAPI
2. 编译项目
$ cd SafelineAPI
$ go build -o safelineApi ./cmd/safelineApi/main.go
// 可根据不同平台来设定不同的编译环境
$ go env -w GOOS=linux //编译环境修改为linux,可选: linux/windows/darwin
$ go env -w GOARCH=amd64 //编辑架构修改为amd64,可选: amd64/arm64
3. 配置文件编辑
{
"SafeLine": {
"Host": {
"HostName": "192.168.1.4",
"Port": "1443"
},
"ApiToken": "xxx"
},
"ApplyCert": {
"Days": 30,
"Email": "xxx",
"SavePath": "/tmp/ssl",
"DNSProviderConfig": {
"DNSProvider": "xxx",
"TencentCloud": {
"SecretId": "xxx",
"SecretKey": "xxx"
},
"AliCloud": {
"AccessKeyId": "xxx",
"AccessKeySecret": "xxx",
"RAMRole": "xxx(可选)",
"STSToken": "xxx(可选)"
},
"HuaweiCloud": {
"AccessKeyId": "xxx",
"Region": "xxx",
"SecretAccessKey": "xxx"
},
"WestCN": {
"Username": "xxx",
"Password": "xxx"
},
"RainYun": {
"ApiKey": "xxx"
}
}
}
}
参数介绍:
SafeLine
HostName
: 雷池管理后台地址。默认为safeline-mgt
容器IP;Port
: 雷池管理后台端口。默认为1443
;ApiToken
: 雷池接口API Token
,从控制台获取;
ApplyCert
Days
: 过期时间,默认当证书剩余有效期小于该值时,则对证书进行更新;Email
: 申请证书时所使用的邮箱;SavePath
: 申请证书临时保存位置;DNSProviderConfig
: DNS服务提供商配置DNSProvider
: 域名服务提供商,可选TencentCloud/AliCloud/HuaweiCloud/WestCN/RainYun
,下列的相关参数为云服务平台账号的凭据。
执行文件
$ ./safelineApi ./config.json //<可执行文件路径> <配置文件路径>
计划任务(可选)
0 0 1,31 * * root /opt/safelineApi/safelineApi /opt/safelineApi/config.json > /opt/safelineApi/app.log
工具效果
工具执行前证书有效期如图:
测试环境,过期时间设定为90天
工具执行部分日志如下:
[SUCCESS] 2025/04/15 21:36:07 SafeLine 相关配置检验完成!
[INFO] 2025/04/15 21:36:07 ApplyCert 相关配置检验完成!
[INFO] 2025/04/15 21:36:07 配置检查完毕,即将开始更新证书!
[INFO] 2025/04/15 21:36:07 本次需要更新证书数量有 6 个
2025/04/15 21:36:08 [INFO] acme: Registering account for admin@example.com
2025/04/15 21:36:09 [INFO] [www.doicat.com] acme: Obtaining bundled SAN certificate
2025/04/15 21:36:10 [INFO] [www.doicat.com] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz/2342744127/505962379607
2025/04/15 21:36:10 [INFO] [www.doicat.com] acme: Could not find solver for: tls-alpn-01
2025/04/15 21:36:10 [INFO] [www.doicat.com] acme: Could not find solver for: http-01
2025/04/15 21:36:10 [INFO] [www.doicat.com] acme: use dns-01 solver
2025/04/15 21:36:10 [INFO] [www.doicat.com] acme: Preparing to solve DNS-01
2025/04/15 21:36:12 [INFO] [www.doicat.com] acme: Trying to solve DNS-01
2025/04/15 21:36:12 [INFO] [www.doicat.com] acme: Checking DNS record propagation. [nameservers=183.60.83.19:53,183.60.82.98:53]
2025/04/15 21:36:14 [INFO] Wait for propagation [timeout: 1m0s, interval: 2s]
2025/04/15 21:36:22 [INFO] [www.doicat.com] The server validated our request
2025/04/15 21:36:22 [INFO] [www.doicat.com] acme: Cleaning DNS-01 challenge
2025/04/15 21:36:24 [INFO] [www.doicat.com] acme: Validations succeeded; requesting certificates
2025/04/15 21:36:27 [INFO] [www.doicat.com] Server responded with a certificate.
[SUCCESS] 2025/04/15 21:36:43 域名 [www.doicat.com] 证书更新成功!
执行后证书更新如下:
结尾
这个简单的项目就到这里了,主要还是为了解决证书更新的问题,文章内容不是很丰富(由于最近学业较繁忙,凭据申请这些没有写进去,各位可以上官网查询文档来获取),项目还是有需要完善的地方,有想法的小伙伴可以留言,在条件允许的情况下会尽力去实现。