123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package acme
- import (
- "crypto/x509"
- "encoding/pem"
- "errors"
- "fmt"
- "os"
- "time"
- )
- // Get the issuer name from pem file
- func ExtractIssuerNameFromPEM(pemFilePath string) (string, error) {
- // Read the PEM file
- pemData, err := os.ReadFile(pemFilePath)
- if err != nil {
- return "", err
- }
- return ExtractIssuerName(pemData)
- }
- // Get the DNSName in the cert
- func ExtractDomains(certBytes []byte) ([]string, error) {
- domains := []string{}
- block, _ := pem.Decode(certBytes)
- if block != nil {
- cert, err := x509.ParseCertificate(block.Bytes)
- if err != nil {
- return []string{}, err
- }
- for _, dnsName := range cert.DNSNames {
- if !contains(domains, dnsName) {
- domains = append(domains, dnsName)
- }
- }
- return domains, nil
- }
- return []string{}, errors.New("decode cert bytes failed")
- }
- func ExtractIssuerName(certBytes []byte) (string, error) {
- // Parse the PEM block
- block, _ := pem.Decode(certBytes)
- if block == nil || block.Type != "CERTIFICATE" {
- return "", fmt.Errorf("failed to decode PEM block containing certificate")
- }
- // Parse the certificate
- cert, err := x509.ParseCertificate(block.Bytes)
- if err != nil {
- return "", fmt.Errorf("failed to parse certificate: %v", err)
- }
- // Check if exist incase some acme server didn't have org section
- if len(cert.Issuer.Organization) == 0 {
- return "", fmt.Errorf("cert didn't have org section exist")
- }
- // Extract the issuer name
- issuer := cert.Issuer.Organization[0]
- return issuer, nil
- }
- // Check if a cert is expired by public key
- func CertIsExpired(certBytes []byte) bool {
- block, _ := pem.Decode(certBytes)
- if block != nil {
- cert, err := x509.ParseCertificate(block.Bytes)
- if err == nil {
- elapsed := time.Since(cert.NotAfter)
- if elapsed > 0 {
- // if it is expired then add it in
- // make sure it's uniqueless
- return true
- }
- }
- }
- return false
- }
- // CertExpireSoon check if the given cert bytes will expires within the given number of days from now
- func CertExpireSoon(certBytes []byte, numberOfDays int) bool {
- block, _ := pem.Decode(certBytes)
- if block != nil {
- cert, err := x509.ParseCertificate(block.Bytes)
- if err == nil {
- expirationDate := cert.NotAfter
- threshold := time.Duration(numberOfDays) * 24 * time.Hour
- timeRemaining := time.Until(expirationDate)
- if timeRemaining <= threshold {
- return true
- }
- }
- }
- return false
- }
|