auto_cert.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package cert
  2. import (
  3. "github.com/0xJacky/Nginx-UI/server/model"
  4. "log"
  5. "strings"
  6. "time"
  7. )
  8. func handleIssueCertLogChan(logChan chan string) {
  9. defer func() {
  10. if err := recover(); err != nil {
  11. log.Println("[Auto Cert] handleIssueCertLogChan", err)
  12. }
  13. }()
  14. for logString := range logChan {
  15. log.Println("[Auto Cert] Info", logString)
  16. }
  17. }
  18. func AutoCert() {
  19. defer func() {
  20. if err := recover(); err != nil {
  21. log.Println("[AutoCert] Recover", err)
  22. }
  23. }()
  24. log.Println("[AutoCert] Start")
  25. autoCertList := model.GetAutoCertList()
  26. for i := range autoCertList {
  27. domain := autoCertList[i].Domain
  28. certModel, err := model.FirstCert(domain)
  29. if err != nil {
  30. log.Println("[AutoCert] Error get certificate from database", err)
  31. continue
  32. }
  33. if certModel.SSLCertificatePath == "" {
  34. log.Println("[AutoCert] Error ssl_certificate_path is empty, " +
  35. "try to reopen auto-cert for this domain:" + domain)
  36. continue
  37. }
  38. cert, err := GetCertInfo(certModel.SSLCertificatePath)
  39. if err != nil {
  40. log.Println("GetCertInfo Err", err)
  41. // Get certificate info error, ignore this domain
  42. continue
  43. }
  44. // before 1 mo
  45. if time.Now().Before(cert.NotBefore.AddDate(0, 1, 0)) {
  46. continue
  47. }
  48. // after 1 mo, reissue certificate
  49. logChan := make(chan string, 1)
  50. errChan := make(chan error, 1)
  51. // support SAN certification
  52. go IssueCert(strings.Split(domain, "_"), logChan, errChan)
  53. go handleIssueCertLogChan(logChan)
  54. // block, unless errChan closed
  55. for err = range errChan {
  56. log.Println("Error cert.IssueCert", err)
  57. }
  58. close(logChan)
  59. }
  60. }