sslcert.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package web
  2. import (
  3. "context"
  4. "fmt"
  5. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. )
  8. type SSLCert interface {
  9. ProcessSSLCertificate(ctx context.Context, req *v1.WebForwardingRequest, cdnUid int) error
  10. ProcessSSLCertificateUpdate(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, cdnUid int) error
  11. CleanupSSLCertificate(ctx context.Context, oldData *model.WebForwarding) error
  12. }
  13. // ProcessSSLCertificate 处理SSL证书
  14. func (s *aidedWebService) ProcessSSLCertificate(ctx context.Context, req *v1.WebForwardingRequest, cdnUid int) error {
  15. if !s.IsHttpsProtocol(req.WebForwardingData.IsHttps) {
  16. return nil // 非HTTPS协议不需要处理SSL证书
  17. }
  18. // 添加SSL证书
  19. sslCertId, err := s.sslCert.AddSSLCert(ctx, v1.SSL{
  20. Name: req.WebForwardingData.Domain,
  21. Domain: req.WebForwardingData.Domain,
  22. CertData: req.WebForwardingData.HttpsCert,
  23. KeyData: req.WebForwardingData.HttpsKey,
  24. CdnUserId: cdnUid,
  25. Description: req.WebForwardingData.Comment,
  26. })
  27. if err != nil {
  28. return fmt.Errorf("添加SSL证书失败: %w", err)
  29. }
  30. // 更新请求中的证书ID
  31. req.WebForwardingData.SslCertId = sslCertId
  32. // 编辑SSL策略
  33. if err := s.sslCert.EditSslPolicy(ctx, req.WebForwardingData.SslPolicyId, []int64{sslCertId}, "add"); err != nil {
  34. return fmt.Errorf("编辑SSL策略失败: %w", err)
  35. }
  36. return nil
  37. }
  38. // ProcessSSLCertificateUpdate 处理SSL证书更新
  39. func (s *aidedWebService) ProcessSSLCertificateUpdate(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, cdnUid int) error {
  40. if !s.IsHttpsProtocol(req.WebForwardingData.IsHttps) {
  41. return nil // 非HTTPS协议不需要处理SSL证书
  42. }
  43. // 如果证书ID为0
  44. if oldData.SslCertId == 0 {
  45. err := s.ProcessSSLCertificate(ctx, req, cdnUid)
  46. if err != nil {
  47. return fmt.Errorf("处理SSL证书失败: %w", err)
  48. }
  49. return nil
  50. }
  51. // 如果证书内容有变化
  52. if oldData.HttpsCert != req.WebForwardingData.HttpsCert || oldData.HttpsKey != req.WebForwardingData.HttpsKey {
  53. if err := s.sslCert.EditSSLCert(ctx, v1.SSL{
  54. Name: req.WebForwardingData.Domain,
  55. CertId: oldData.SslCertId,
  56. CertData: req.WebForwardingData.HttpsCert,
  57. KeyData: req.WebForwardingData.HttpsKey,
  58. CdnUserId: cdnUid,
  59. Domain: req.WebForwardingData.Domain,
  60. Description: req.WebForwardingData.Comment,
  61. }); err != nil {
  62. return fmt.Errorf("更新SSL证书失败: %w", err)
  63. }
  64. }
  65. return nil
  66. }
  67. // CleanupSSLCertificate 清理SSL证书
  68. func (s *aidedWebService) CleanupSSLCertificate(ctx context.Context, oldData *model.WebForwarding) error {
  69. if oldData.SslCertId != 0 {
  70. if err := s.cdn.DelSSLCert(ctx, int64(oldData.SslCertId)); err != nil {
  71. return fmt.Errorf("删除SSL证书失败: %w", err)
  72. }
  73. if err := s.sslCert.EditSslPolicy(ctx, int64(oldData.SslPolicyId), []int64{int64(oldData.SslCertId)}, "del"); err != nil {
  74. return fmt.Errorf("删除SSL策略失败: %w", err)
  75. }
  76. }
  77. return nil
  78. }