x509.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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: %v", err)
  16. }
  17. return cert, nil
  18. }
  19. func CheckCertWithDomain(cert *x509.Certificate, domain string) bool {
  20. // 遍历主题备用名称查找匹配的域名
  21. for _, name := range cert.DNSNames {
  22. if name == domain {
  23. return true // 找到了匹配的域名
  24. }
  25. }
  26. // 检查通用名作为回退,虽然现代实践倾向于使用SAN
  27. if cert.Subject.CommonName != "" && cert.Subject.CommonName == domain {
  28. return true // 通用名匹配
  29. }
  30. // 如果没有找到匹配,则返回错误
  31. return false
  32. }
  33. func CheckCertWithTime(cert *x509.Certificate, gracePeriod time.Duration) bool {
  34. now := time.Now()
  35. nowWithGracePeriod := now.Add(gracePeriod)
  36. if now.Before(cert.NotBefore) {
  37. return false
  38. } else if nowWithGracePeriod.After(cert.NotBefore) {
  39. return false
  40. }
  41. return false
  42. }