我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

自动检测SSL证书有效期并发送邮件提醒工具

来源:网络 更新时间:2024-08-29 09:30:59

自从云厂商的免费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 中,每天执行一次。