obtain.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package cert
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/nginx"
  4. "github.com/0xJacky/Nginx-UI/model"
  5. "github.com/go-acme/lego/v4/certificate"
  6. "github.com/go-acme/lego/v4/lego"
  7. "github.com/pkg/errors"
  8. "log"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. )
  13. func obtain(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan chan error) {
  14. request := certificate.ObtainRequest{
  15. Domains: payload.ServerName,
  16. Bundle: true,
  17. }
  18. l.Println("[INFO] [Nginx UI] Obtaining certificate")
  19. certificates, err := client.Certificate.Obtain(request)
  20. if err != nil {
  21. errChan <- errors.Wrap(err, "obtain certificate error")
  22. return
  23. }
  24. payload.Resource = &model.CertificateResource{
  25. Resource: certificates,
  26. PrivateKey: certificates.PrivateKey,
  27. Certificate: certificates.Certificate,
  28. IssuerCertificate: certificates.IssuerCertificate,
  29. CSR: certificates.CSR,
  30. }
  31. name := strings.Join(payload.ServerName, "_")
  32. saveDir := nginx.GetConfPath("ssl/" + name + "_" + string(payload.KeyType))
  33. if _, err = os.Stat(saveDir); os.IsNotExist(err) {
  34. err = os.MkdirAll(saveDir, 0755)
  35. if err != nil {
  36. errChan <- errors.Wrap(err, "mkdir error")
  37. return
  38. }
  39. }
  40. // Each certificate comes back with the cert bytes, the bytes of the client's
  41. // private key, and a certificate URL. SAVE THESE TO DISK.
  42. l.Println("[INFO] [Nginx UI] Writing certificate to disk")
  43. err = os.WriteFile(filepath.Join(saveDir, "fullchain.cer"),
  44. certificates.Certificate, 0644)
  45. if err != nil {
  46. errChan <- errors.Wrap(err, "write fullchain.cer error")
  47. return
  48. }
  49. l.Println("[INFO] [Nginx UI] Writing certificate private key to disk")
  50. err = os.WriteFile(filepath.Join(saveDir, "private.key"),
  51. certificates.PrivateKey, 0644)
  52. if err != nil {
  53. errChan <- errors.Wrap(err, "write private.key error")
  54. return
  55. }
  56. }