auto_cert.go 1.4 KB

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