cert_info.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package cert
  2. import (
  3. "crypto/x509"
  4. "encoding/pem"
  5. "github.com/0xJacky/Nginx-UI/internal/helper"
  6. "github.com/0xJacky/Nginx-UI/internal/nginx"
  7. "github.com/pkg/errors"
  8. "os"
  9. "time"
  10. )
  11. type Info struct {
  12. SubjectName string `json:"subject_name"`
  13. IssuerName string `json:"issuer_name"`
  14. NotAfter time.Time `json:"not_after"`
  15. NotBefore time.Time `json:"not_before"`
  16. }
  17. func GetCertInfo(sslCertificatePath string) (info *Info, err error) {
  18. if !helper.IsUnderDirectory(sslCertificatePath, nginx.GetConfPath()) {
  19. err = errors.New("ssl certificate path is not under the nginx conf path")
  20. return
  21. }
  22. certData, err := os.ReadFile(sslCertificatePath)
  23. if err != nil {
  24. err = errors.Wrap(err, "error read certificate")
  25. return
  26. }
  27. block, _ := pem.Decode(certData)
  28. if block == nil || block.Type != "CERTIFICATE" {
  29. err = errors.New("certificate decoding error")
  30. return
  31. }
  32. cert, err := x509.ParseCertificate(block.Bytes)
  33. if err != nil {
  34. err = errors.Wrap(err, "certificate parsing error")
  35. return
  36. }
  37. info = &Info{
  38. SubjectName: cert.Subject.CommonName,
  39. IssuerName: cert.Issuer.CommonName,
  40. NotAfter: cert.NotAfter,
  41. NotBefore: cert.NotBefore,
  42. }
  43. return
  44. }