auto_cert.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package cert
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/logger"
  4. "github.com/0xJacky/Nginx-UI/model"
  5. "github.com/pkg/errors"
  6. "strings"
  7. "time"
  8. )
  9. func AutoObtain() {
  10. defer func() {
  11. if err := recover(); err != nil {
  12. logger.Error("AutoCert Recover", err)
  13. }
  14. }()
  15. logger.Info("AutoCert Worker Started")
  16. autoCertList := model.GetAutoCertList()
  17. for _, certModel := range autoCertList {
  18. certModel := certModel
  19. renew(certModel)
  20. }
  21. logger.Info("AutoCert Worker End")
  22. }
  23. func renew(certModel *model.Cert) {
  24. confName := certModel.Filename
  25. log := &Logger{}
  26. log.SetCertModel(certModel)
  27. defer log.Exit()
  28. if len(certModel.Filename) == 0 {
  29. log.Error(errors.New("filename is empty"))
  30. return
  31. }
  32. if len(certModel.Domains) == 0 {
  33. log.Error(errors.New("domains list is empty, " +
  34. "try to reopen auto-cert for this config:" + confName))
  35. return
  36. }
  37. if certModel.SSLCertificatePath != "" {
  38. cert, err := GetCertInfo(certModel.SSLCertificatePath)
  39. if err != nil {
  40. // Get certificate info error, ignore this certificate
  41. log.Error(errors.Wrap(err, "get certificate info error"))
  42. return
  43. }
  44. if time.Now().Sub(cert.NotBefore).Hours()/24 < 7 {
  45. // not between 1 week, ignore this certificate
  46. return
  47. }
  48. }
  49. // after 1 mo, reissue certificate
  50. logChan := make(chan string, 1)
  51. errChan := make(chan error, 1)
  52. // support SAN certification
  53. payload := &ConfigPayload{
  54. ServerName: certModel.Domains,
  55. ChallengeMethod: certModel.ChallengeMethod,
  56. DNSCredentialID: certModel.DnsCredentialID,
  57. }
  58. // errChan will be closed inside IssueCert
  59. go IssueCert(payload, logChan, errChan)
  60. go func() {
  61. for logString := range logChan {
  62. log.Info(strings.TrimSpace(logString))
  63. }
  64. }()
  65. // block, unless errChan closed
  66. for err := range errChan {
  67. log.Error(err)
  68. }
  69. }