cert_info.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package cert
  2. import (
  3. "crypto/x509"
  4. "encoding/pem"
  5. "os"
  6. "time"
  7. "github.com/0xJacky/Nginx-UI/internal/helper"
  8. "github.com/0xJacky/Nginx-UI/internal/nginx"
  9. )
  10. type Info struct {
  11. SubjectName string `json:"subject_name"`
  12. IssuerName string `json:"issuer_name"`
  13. NotAfter time.Time `json:"not_after"`
  14. NotBefore time.Time `json:"not_before"`
  15. }
  16. func GetCertInfo(sslCertificatePath string) (info *Info, err error) {
  17. if !helper.IsUnderDirectory(sslCertificatePath, nginx.GetConfPath()) {
  18. err = ErrCertPathIsNotUnderTheNginxConfDir
  19. return
  20. }
  21. certData, err := os.ReadFile(sslCertificatePath)
  22. if err != nil {
  23. return
  24. }
  25. block, _ := pem.Decode(certData)
  26. if block == nil || block.Type != "CERTIFICATE" {
  27. err = ErrCertDecode
  28. return
  29. }
  30. cert, err := x509.ParseCertificate(block.Bytes)
  31. if err != nil {
  32. err = ErrCertParse
  33. return
  34. }
  35. // for wildcard certificate, the subject name is the first DNS name
  36. subjectName := cert.Subject.CommonName
  37. if subjectName == "" {
  38. for _, name := range cert.DNSNames {
  39. if name != "" {
  40. subjectName = name
  41. break
  42. }
  43. }
  44. }
  45. info = &Info{
  46. SubjectName: subjectName,
  47. IssuerName: cert.Issuer.CommonName,
  48. NotAfter: cert.NotAfter,
  49. NotBefore: cert.NotBefore,
  50. }
  51. return
  52. }