certificate_map.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2021 Tencent Inc. All rights reserved.
  2. package core
  3. import (
  4. "context"
  5. "crypto/x509"
  6. "git.nanodreamtech.com/sg/wechatpay-go/utils"
  7. )
  8. // CertificateMap 最简单的证书获取器——证书Map
  9. type CertificateMap struct {
  10. m map[string]*x509.Certificate
  11. newest string
  12. }
  13. // Reset 完整重设 CertificateMap 中存储的证书,并重新选择最新的证书
  14. func (m *CertificateMap) Reset(newCertificates map[string]*x509.Certificate) {
  15. var (
  16. newestCert *x509.Certificate
  17. newestSerialNo string
  18. )
  19. m.m = make(map[string]*x509.Certificate)
  20. for serialNo, cert := range newCertificates {
  21. m.m[serialNo] = cert
  22. if newestSerialNo == "" || newestCert == nil || cert.NotBefore.After(newestCert.NotBefore) {
  23. newestSerialNo = serialNo
  24. newestCert = cert
  25. }
  26. }
  27. m.newest = newestSerialNo
  28. }
  29. // Get 获取证书序列号对应的平台证书
  30. func (m *CertificateMap) Get(_ context.Context, serialNumber string) (*x509.Certificate, bool) {
  31. cert, ok := m.m[serialNumber]
  32. return cert, ok
  33. }
  34. // GetAll 获取平台证书Map
  35. func (m *CertificateMap) GetAll(_ context.Context) map[string]*x509.Certificate {
  36. ret := make(map[string]*x509.Certificate)
  37. for serialNo, cert := range m.m {
  38. ret[serialNo] = cert
  39. }
  40. return ret
  41. }
  42. // GetNewestSerial 获取最新的平台证书的证书序列号
  43. func (m *CertificateMap) GetNewestSerial(_ context.Context) string {
  44. return m.newest
  45. }
  46. // NewCertificateMap 使用 证书序列号->证书 映射 初始化 CertificateMap
  47. func NewCertificateMap(certificateMap map[string]*x509.Certificate) *CertificateMap {
  48. m := CertificateMap{}
  49. m.Reset(certificateMap)
  50. return &m
  51. }
  52. // NewCertificateMapWithList 使用 证书列表 初始化 CertificateMap
  53. func NewCertificateMapWithList(l []*x509.Certificate) *CertificateMap {
  54. m := make(map[string]*x509.Certificate)
  55. for _, c := range l {
  56. m[utils.GetCertificateSerialNumber(*c)] = c
  57. }
  58. return NewCertificateMap(m)
  59. }