自动续期

This commit is contained in:
ZhuoQinghui 2024-10-25 11:51:54 +08:00
parent 784e8b9b2f
commit 75a8fd1bcf
5 changed files with 83 additions and 7 deletions

View File

@ -21,7 +21,7 @@ func testParseCert() {
// 读取 // 读取
dir := src.GetAppConfig().CertDir dir := src.GetAppConfig().CertDir
dir = filepath.Join(dir, "acme.zzzykj.cn") dir = filepath.Join(dir, "acme.zzzykj.cn")
certFile := path.Join(dir, "cert.crt") certFile := path.Join(dir, src.CertFileName)
certBytes, err := os.ReadFile(certFile) certBytes, err := os.ReadFile(certFile)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -99,12 +99,12 @@ func saveCertFile(cert *certificate.Resource, name string) {
} }
certBytes := cert.Certificate certBytes := cert.Certificate
err = os.WriteFile(path.Join(dir, "cert.crt"), certBytes, 0755) err = os.WriteFile(path.Join(dir, CertFileName), certBytes, 0755)
if err != nil { if err != nil {
log.Fatalf("Failed to save certificate: %v", err) log.Fatalf("Failed to save certificate: %v", err)
} }
err = os.WriteFile(path.Join(dir, "cert.key"), cert.PrivateKey, 0755) err = os.WriteFile(path.Join(dir, KeyFileName), cert.PrivateKey, 0755)
if err != nil { if err != nil {
log.Fatalf("Failed to save private key: %v", err) log.Fatalf("Failed to save private key: %v", err)
} }
@ -128,7 +128,7 @@ func saveCertFile(cert *certificate.Resource, name string) {
if err != nil { if err != nil {
log.Fatalf("Failed to marshal certificate: %v", err) log.Fatalf("Failed to marshal certificate: %v", err)
} }
err = os.WriteFile(path.Join(dir, "info.json"), certJson, 0644) err = os.WriteFile(path.Join(dir, CertInfoFileName), certJson, 0644)
if err != nil { if err != nil {
log.Fatalf("Failed to save certificate info: %v", err) log.Fatalf("Failed to save certificate info: %v", err)
} }

View File

@ -43,7 +43,7 @@ func getCert(c *gin.Context) {
}) })
return return
} }
crtFilePath := path.Join(dir, "cert.crt") crtFilePath := path.Join(dir, CertFileName)
crtContent, err := os.ReadFile(crtFilePath) crtContent, err := os.ReadFile(crtFilePath)
if err != nil { if err != nil {
c.JSON(200, gin.H{ c.JSON(200, gin.H{
@ -54,7 +54,7 @@ func getCert(c *gin.Context) {
} }
crt := string(crtContent) crt := string(crtContent)
keyFilePath := path.Join(dir, "cert.key") keyFilePath := path.Join(dir, KeyFileName)
keyContent, err := os.ReadFile(keyFilePath) keyContent, err := os.ReadFile(keyFilePath)
if err != nil { if err != nil {
c.JSON(200, gin.H{ c.JSON(200, gin.H{

View File

@ -1,7 +1,79 @@
package src package src
import "log" import (
"encoding/json"
"log"
"os"
"path"
"time"
)
var AutoRefreshCertTicker = time.NewTicker(time.Hour)
func AutoRefreshCert() { func AutoRefreshCert() {
log.Println("Start auto refresh cert") log.Println("Start auto refresh cert")
defer AutoRefreshCertTicker.Stop()
for {
select {
case <-AutoRefreshCertTicker.C:
doRefreshCert()
}
}
}
func doRefreshCert() {
domains := GetAppConfig().Domains
for _, domain := range domains {
doRefreshCertOnce(domain)
}
}
func doRefreshCertOnce(domain Domain) {
name := domain.Name
dir := GetAppConfig().CertDir
certDir := path.Join(dir, name)
// 判断文件夹和证书文件是否存在
_, err := os.Stat(certDir)
if os.IsNotExist(err) {
log.Println("Applying for a certificate, Domain: {} certificate directory does not exist!", name)
Apply(domain)
return
}
if existFile(certDir, CertFileName) {
log.Println("Applying for a certificate, Domain: {} {} does not exist!", name, CertFileName)
Apply(domain)
return
}
if existFile(certDir, KeyFileName) {
log.Println("Applying for a certificate, Domain: {} {} does not exist!", name, KeyFileName)
Apply(domain)
return
}
if existFile(certDir, CertInfoFileName) {
log.Println("Applying for a certificate, Domain: {} {} does not exist!", name, CertInfoFileName)
Apply(domain)
return
}
infoFile := path.Join(dir, CertInfoFileName)
infoBytes, err := os.ReadFile(infoFile)
if err != nil {
log.Println("Failed to read cert info file, Domain: {}", name)
}
var certInfo CertInfo
err = json.Unmarshal(infoBytes, &certInfo)
if err != nil {
log.Println("Failed to parse cert info file, Domain: {}", name)
}
log.Println("Checking if the certificate is expired, Domain: {}", name)
if certInfo.Info.NotAfter.Sub(time.Now()) < 7*24*time.Hour {
log.Println("Apply for a certificate that is about to expire, domain name:", name)
Apply(domain)
}
}
func existFile(dir string, fileName string) bool {
f := path.Join(dir, fileName)
_, err := os.Stat(f)
return !os.IsNotExist(err)
} }

View File

@ -3,6 +3,10 @@ package src
const PidFile = "acme-mana.pid" const PidFile = "acme-mana.pid"
const SocketFile = "acme-mana.sock" const SocketFile = "acme-mana.sock"
const CertFileName = "fullchain.pem"
const KeyFileName = "privkey.pem"
const CertInfoFileName = "info.json"
var appConfig AppConfig = ReadConfig() var appConfig AppConfig = ReadConfig()
func GetAppConfig() AppConfig { func GetAppConfig() AppConfig {