| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | package certimport (	"crypto/x509"	"encoding/pem"	"os"	"time"	"github.com/0xJacky/Nginx-UI/internal/helper"	"github.com/0xJacky/Nginx-UI/internal/nginx")type Info struct {	SubjectName string    `json:"subject_name"`	IssuerName  string    `json:"issuer_name"`	NotAfter    time.Time `json:"not_after"`	NotBefore   time.Time `json:"not_before"`}func GetCertInfo(sslCertificatePath string) (info *Info, err error) {	if !helper.IsUnderDirectory(sslCertificatePath, nginx.GetConfPath()) {		err = ErrCertPathIsNotUnderTheNginxConfDir		return	}	certData, err := os.ReadFile(sslCertificatePath)	if err != nil {		return	}	block, _ := pem.Decode(certData)	if block == nil || block.Type != "CERTIFICATE" {		err = ErrCertDecode		return	}	cert, err := x509.ParseCertificate(block.Bytes)	if err != nil {		err = ErrCertParse		return	}	// for wildcard certificate, the subject name is the first DNS name	subjectName := cert.Subject.CommonName	if subjectName == "" {		for _, name := range cert.DNSNames {			if name != "" {				subjectName = name				break			}		}	}	info = &Info{		SubjectName: subjectName,		IssuerName:  cert.Issuer.CommonName,		NotAfter:    cert.NotAfter,		NotBefore:   cert.NotBefore,	}	return}
 |