我们提供安全,免费的手游软件下载!
自从云厂商的免费SSL证书改成3个月,且每个域名只能申请20个证书之后,我开始寻找其他免费的SSL证书方案。然而,免费方案并不会提醒证书的过期情况。因此,我决定编写一个工具,每天定时查询证书的剩余有效天数,若证书即将过期,便发送邮件提醒。
最基本的代码功能是检测网站SSL证书的有效天数,可以通过命令行传参的方式指定网站域名。
package main
import (
"crypto/tls"
"flag"
"fmt"
"net"
"os"
"sync"
"time"
)
var (
port int
wg sync.WaitGroup
)
func checkssl(domain string, port int) {
// ...(代码部分省略)
}
func main() {
// ...(代码部分省略)
}
使用示例:
# 1. 编译
go build
# 2. 命令行传参的方式指定域名
./check-ssl baidu.com ithome.com qq.com
# 输出
baidu.com, issue time: 2024-01-30 08:00:00 +0800 CST, expire time: 2025-03-02 07:59:59 +0800 CST, days left: 187
ithome.com, issue time: 2024-01-22 08:00:00 +0800 CST, expire time: 2025-02-22 07:59:59 +0800 CST, days left: 179
qq.com, issue time: 2024-06-04 08:00:00 +0800 CST, expire time: 2025-06-11 07:59:59 +0800 CST, days left: 288
需要完善的功能主要是发送邮件,这里使用SMTP协议来发送邮件。如果使用163邮箱,需要先获取一个SMTP的授权码。由于需要配置SMTP的连接信息,我决定使用配置文件的方式传入配置,这样也更加方便后期修改。配置文件
config.yaml
示例如下:
domains:
- baidu.com
- qq.com
email:
smtp:
host: "smtp.163.com" # smtp服务器的地址
port: 465 # 因为云服务器屏蔽了25端口, 只能使用tls加密的465端口
from: "" # 发送方邮箱
token: "" # 授权码
sendto:
- "qq@qq.com" # 接收方的邮箱地址
expire: 7 # 证书剩余有效天数, 小于7天时发送邮件提醒
读取配置的代码文件
config.go
,使用
viper
来读取配置文件。
package main
import "github.com/spf13/viper"
var (
v *viper.Viper
)
type SMTPServer struct {
Host string
Port int
Token string
From string
}
func initViper() {
// ...(代码部分省略)
}
type configer struct{}
func NewConfiger() configer {
// ...(代码部分省略)
}
func (c configer) GetSMTPServer() SMTPServer {
// ...(代码部分省略)
}
func (c configer) GetDomains() []string {
// ...(代码部分省略)
}
func (c configer) GetSendTos() []string {
// ...(代码部分省略)
}
func (c configer) GetExpiry() int {
// ...(代码部分省略)
}
发送邮件的相关代码文件:
notify.go
package main
import (
"crypto/tls"
"fmt"
"net/smtp"
"github.com/jordan-wright/email"
)
type Postman struct {
SmtpServer SMTPServer
SendTos []string
}
func (p Postman) SendEmail(domain string, dayleft int) {
// ...(代码部分省略)
}
主体代码文件
main.go
,主要修改地方:检测到证书即将过期后,调用发送邮件的相关方法。
package main
import (
"crypto/tls"
"flag"
"fmt"
"net"
"sync"
"time"
)
var (
port int
configfile string
wg sync.WaitGroup
c configer = NewConfiger()
)
func checkssl(domain string, port int) {
// ...(代码部分省略)
}
func main() {
// ...(代码部分省略)
}
本地测试通过后,可以将其配置到服务器的
crontab
中,每天执行一次。
热门资讯