x509.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package utils
  2. import (
  3. "crypto/x509"
  4. "encoding/pem"
  5. "fmt"
  6. "time"
  7. )
  8. func ReadCertificate(data []byte) (*x509.Certificate, error) {
  9. block, _ := pem.Decode(data)
  10. if block == nil || block.Type != "CERTIFICATE" {
  11. return nil, fmt.Errorf("failed to decode PEM block containing certificate")
  12. }
  13. cert, err := x509.ParseCertificate(block.Bytes)
  14. if err != nil {
  15. return nil, fmt.Errorf("failed to parse certificate: %s", err.Error())
  16. } else if cert == nil {
  17. return nil, fmt.Errorf("failed to parse certificate: return nil, unknown reason")
  18. }
  19. return cert, nil
  20. }
  21. func CheckCertWithDomain(cert *x509.Certificate, domain string) bool {
  22. // 遍历主题备用名称查找匹配的域名
  23. for _, name := range cert.DNSNames {
  24. if name == domain {
  25. return true // 找到了匹配的域名
  26. }
  27. }
  28. // 检查通用名作为回退,虽然现代实践倾向于使用SAN
  29. if cert.Subject.CommonName != "" && cert.Subject.CommonName == domain {
  30. return true // 通用名匹配
  31. }
  32. // 如果没有找到匹配,则返回错误
  33. return false
  34. }
  35. func CheckCertWithTime(cert *x509.Certificate, gracePeriod time.Duration) bool {
  36. now := time.Now()
  37. nowWithGracePeriod := now.Add(gracePeriod)
  38. if now.Before(cert.NotBefore) {
  39. return false
  40. } else if nowWithGracePeriod.After(cert.NotAfter) {
  41. return false
  42. }
  43. return true
  44. }