fix: tool detects LE vs self-signed, retries LE for fallback certs
This commit is contained in:
parent
63099703a1
commit
434b23aee2
1 changed files with 29 additions and 4 deletions
|
|
@ -60,7 +60,7 @@ func runCert(args []string) {
|
||||||
log.Fatalf("Failed to create backup dir: %v", err)
|
log.Fatalf("Failed to create backup dir: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if all domains have valid certs in backup
|
// Check if all domains have valid LE certs in backup
|
||||||
needIssue := false
|
needIssue := false
|
||||||
for _, domain := range domains {
|
for _, domain := range domains {
|
||||||
certFile := filepath.Join(*backupDir, domain, "fullchain.pem")
|
certFile := filepath.Join(*backupDir, domain, "fullchain.pem")
|
||||||
|
|
@ -69,9 +69,15 @@ func runCert(args []string) {
|
||||||
needIssue = true
|
needIssue = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
// Check expiry
|
// Check if cert is from LE (not self-signed fallback)
|
||||||
if isCertExpired(certFile, 7*24*time.Hour) {
|
if !isCertFromLE(certFile) {
|
||||||
log.Printf("[INFO] Cert for %s expires soon or is invalid, reissuing", domain)
|
log.Printf("[INFO] Cert for %s is not from Let's Encrypt (self-signed fallback), reissuing", domain)
|
||||||
|
needIssue = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// Check expiry (renew if within 30 days)
|
||||||
|
if isCertExpired(certFile, 30*24*time.Hour) {
|
||||||
|
log.Printf("[INFO] Cert for %s expires soon, reissuing", domain)
|
||||||
needIssue = true
|
needIssue = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
@ -274,6 +280,25 @@ func fileExists(path string) bool {
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isCertFromLE(certFile string) bool {
|
||||||
|
data, err := os.ReadFile(certFile)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
block, _ := pem.Decode(data)
|
||||||
|
if block == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
cert, err := x509.ParseCertificate(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if len(cert.Issuer.Organization) > 0 {
|
||||||
|
return strings.Contains(cert.Issuer.Organization[0], "Let's Encrypt")
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func isCertExpired(certFile string, threshold time.Duration) bool {
|
func isCertExpired(certFile string, threshold time.Duration) bool {
|
||||||
data, err := os.ReadFile(certFile)
|
data, err := os.ReadFile(certFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue