diff --git a/internal/deployer/aliyun_alb.go b/internal/deployer/aliyun_alb.go index b676e043..4ee68a7a 100644 --- a/internal/deployer/aliyun_alb.go +++ b/internal/deployer/aliyun_alb.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" - alb20200616 "github.com/alibabacloud-go/alb-20200616/v2/client" - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + aliyunAlb "github.com/alibabacloud-go/alb-20200616/v2/client" + aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client" "github.com/alibabacloud-go/tea/tea" "github.com/usual2970/certimate/internal/domain" @@ -18,7 +18,7 @@ type AliyunALBDeployer struct { option *DeployerOption infos []string - sdkClient *alb20200616.Client + sdkClient *aliyunAlb.Client sslUploader uploader.Uploader } @@ -77,12 +77,12 @@ func (d *AliyunALBDeployer) Deploy(ctx context.Context) error { return nil } -func (d *AliyunALBDeployer) createSdkClient(accessKeyId, accessKeySecret, region string) (*alb20200616.Client, error) { +func (d *AliyunALBDeployer) createSdkClient(accessKeyId, accessKeySecret, region string) (*aliyunAlb.Client, error) { if region == "" { region = "cn-hangzhou" // ALB 服务默认区域:华东一杭州 } - aConfig := &openapi.Config{ + aConfig := &aliyunOpen.Config{ AccessKeyId: tea.String(accessKeyId), AccessKeySecret: tea.String(accessKeySecret), } @@ -96,7 +96,7 @@ func (d *AliyunALBDeployer) createSdkClient(accessKeyId, accessKeySecret, region } aConfig.Endpoint = tea.String(endpoint) - client, err := alb20200616.NewClient(aConfig) + client, err := aliyunAlb.NewClient(aConfig) if err != nil { return nil, err } @@ -114,7 +114,7 @@ func (d *AliyunALBDeployer) deployToLoadbalancer(ctx context.Context) error { // 查询负载均衡实例的详细信息 // REF: https://help.aliyun.com/zh/slb/application-load-balancer/developer-reference/api-alb-2020-06-16-getloadbalancerattribute - getLoadBalancerAttributeReq := &alb20200616.GetLoadBalancerAttributeRequest{ + getLoadBalancerAttributeReq := &aliyunAlb.GetLoadBalancerAttributeRequest{ LoadBalancerId: tea.String(aliLoadbalancerId), } getLoadBalancerAttributeResp, err := d.sdkClient.GetLoadBalancerAttribute(getLoadBalancerAttributeReq) @@ -130,7 +130,7 @@ func (d *AliyunALBDeployer) deployToLoadbalancer(ctx context.Context) error { listListenersLimit := int32(100) var listListenersToken *string = nil for { - listListenersReq := &alb20200616.ListListenersRequest{ + listListenersReq := &aliyunAlb.ListListenersRequest{ MaxResults: tea.Int32(listListenersLimit), NextToken: listListenersToken, LoadBalancerIds: []*string{tea.String(aliLoadbalancerId)}, @@ -162,7 +162,7 @@ func (d *AliyunALBDeployer) deployToLoadbalancer(ctx context.Context) error { listListenersPage = 1 listListenersToken = nil for { - listListenersReq := &alb20200616.ListListenersRequest{ + listListenersReq := &aliyunAlb.ListListenersRequest{ MaxResults: tea.Int32(listListenersLimit), NextToken: listListenersToken, LoadBalancerIds: []*string{tea.String(aliLoadbalancerId)}, @@ -236,7 +236,7 @@ func (d *AliyunALBDeployer) deployToListener(ctx context.Context) error { func (d *AliyunALBDeployer) updateListenerCertificate(ctx context.Context, aliListenerId string, aliCertId string) error { // 查询监听的属性 // REF: https://help.aliyun.com/zh/slb/application-load-balancer/developer-reference/api-alb-2020-06-16-getlistenerattribute - getListenerAttributeReq := &alb20200616.GetListenerAttributeRequest{ + getListenerAttributeReq := &aliyunAlb.GetListenerAttributeRequest{ ListenerId: tea.String(aliListenerId), } getListenerAttributeResp, err := d.sdkClient.GetListenerAttribute(getListenerAttributeReq) @@ -248,9 +248,9 @@ func (d *AliyunALBDeployer) updateListenerCertificate(ctx context.Context, aliLi // 修改监听的属性 // REF: https://help.aliyun.com/zh/slb/application-load-balancer/developer-reference/api-alb-2020-06-16-updatelistenerattribute - updateListenerAttributeReq := &alb20200616.UpdateListenerAttributeRequest{ + updateListenerAttributeReq := &aliyunAlb.UpdateListenerAttributeRequest{ ListenerId: tea.String(aliListenerId), - Certificates: []*alb20200616.UpdateListenerAttributeRequestCertificates{{ + Certificates: []*aliyunAlb.UpdateListenerAttributeRequestCertificates{{ CertificateId: tea.String(aliCertId), }}, } diff --git a/internal/deployer/aliyun_cdn.go b/internal/deployer/aliyun_cdn.go index 97ac0d83..2b633182 100644 --- a/internal/deployer/aliyun_cdn.go +++ b/internal/deployer/aliyun_cdn.go @@ -5,9 +5,8 @@ import ( "encoding/json" "fmt" - cdn20180510 "github.com/alibabacloud-go/cdn-20180510/v5/client" - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" - util "github.com/alibabacloud-go/tea-utils/v2/service" + aliyunCdn "github.com/alibabacloud-go/cdn-20180510/v5/client" + aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client" "github.com/alibabacloud-go/tea/tea" "github.com/usual2970/certimate/internal/domain" @@ -15,28 +14,28 @@ import ( ) type AliyunCDNDeployer struct { - client *cdn20180510.Client option *DeployerOption infos []string + + sdkClient *aliyunCdn.Client } -func NewAliyunCDNDeployer(option *DeployerOption) (*AliyunCDNDeployer, error) { +func NewAliyunCDNDeployer(option *DeployerOption) (Deployer, error) { access := &domain.AliyunAccess{} json.Unmarshal([]byte(option.Access), access) - d := &AliyunCDNDeployer{ - option: option, - } - - client, err := d.createClient(access.AccessKeyId, access.AccessKeySecret) + client, err := (&AliyunCDNDeployer{}).createSdkClient( + access.AccessKeyId, + access.AccessKeySecret, + ) if err != nil { return nil, err } return &AliyunCDNDeployer{ - client: client, - option: option, - infos: make([]string, 0), + option: option, + infos: make([]string, 0), + sdkClient: client, }, nil } @@ -50,35 +49,39 @@ func (d *AliyunCDNDeployer) GetInfo() []string { func (d *AliyunCDNDeployer) Deploy(ctx context.Context) error { certName := fmt.Sprintf("%s-%s-%s", d.option.Domain, d.option.DomainId, rand.RandStr(6)) - setCdnDomainSSLCertificateRequest := &cdn20180510.SetCdnDomainSSLCertificateRequest{ - DomainName: tea.String(getDeployString(d.option.DeployConfig, "domain")), + + // 设置 CDN 域名域名证书 + // REF: https://help.aliyun.com/zh/cdn/developer-reference/api-cdn-2018-05-10-setcdndomainsslcertificate + setCdnDomainSSLCertificateReq := &aliyunCdn.SetCdnDomainSSLCertificateRequest{ + DomainName: tea.String(d.option.DeployConfig.GetConfigAsString("domain")), + CertRegion: tea.String(d.option.DeployConfig.GetConfigOrDefaultAsString("region", "cn-hangzhou")), CertName: tea.String(certName), CertType: tea.String("upload"), SSLProtocol: tea.String("on"), SSLPub: tea.String(d.option.Certificate.Certificate), SSLPri: tea.String(d.option.Certificate.PrivateKey), - CertRegion: tea.String("cn-hangzhou"), } - - runtime := &util.RuntimeOptions{} - - resp, err := d.client.SetCdnDomainSSLCertificateWithOptions(setCdnDomainSSLCertificateRequest, runtime) + setCdnDomainSSLCertificateResp, err := d.sdkClient.SetCdnDomainSSLCertificate(setCdnDomainSSLCertificateReq) if err != nil { - return err + return fmt.Errorf("failed to execute sdk request 'cdn.SetCdnDomainSSLCertificate': %w", err) } - d.infos = append(d.infos, toStr("cdn设置证书", resp)) + d.infos = append(d.infos, toStr("已设置 CDN 域名证书", setCdnDomainSSLCertificateResp)) return nil } -func (d *AliyunCDNDeployer) createClient(accessKeyId, accessKeySecret string) (_result *cdn20180510.Client, _err error) { - config := &openapi.Config{ +func (d *AliyunCDNDeployer) createSdkClient(accessKeyId, accessKeySecret string) (*aliyunCdn.Client, error) { + aConfig := &aliyunOpen.Config{ AccessKeyId: tea.String(accessKeyId), AccessKeySecret: tea.String(accessKeySecret), + Endpoint: tea.String("cdn.aliyuncs.com"), } - config.Endpoint = tea.String("cdn.aliyuncs.com") - _result = &cdn20180510.Client{} - _result, _err = cdn20180510.NewClient(config) - return _result, _err + + client, err := aliyunCdn.NewClient(aConfig) + if err != nil { + return nil, err + } + + return client, nil } diff --git a/internal/deployer/aliyun_clb.go b/internal/deployer/aliyun_clb.go index 11384ba8..87f68a02 100644 --- a/internal/deployer/aliyun_clb.go +++ b/internal/deployer/aliyun_clb.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" - slb20140515 "github.com/alibabacloud-go/slb-20140515/v4/client" + aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client" + aliyunSlb "github.com/alibabacloud-go/slb-20140515/v4/client" "github.com/alibabacloud-go/tea/tea" "github.com/usual2970/certimate/internal/domain" @@ -18,7 +18,7 @@ type AliyunCLBDeployer struct { option *DeployerOption infos []string - sdkClient *slb20140515.Client + sdkClient *aliyunSlb.Client sslUploader uploader.Uploader } @@ -77,12 +77,12 @@ func (d *AliyunCLBDeployer) Deploy(ctx context.Context) error { return nil } -func (d *AliyunCLBDeployer) createSdkClient(accessKeyId, accessKeySecret, region string) (*slb20140515.Client, error) { +func (d *AliyunCLBDeployer) createSdkClient(accessKeyId, accessKeySecret, region string) (*aliyunSlb.Client, error) { if region == "" { region = "cn-hangzhou" // CLB(SLB) 服务默认区域:华东一杭州 } - aConfig := &openapi.Config{ + aConfig := &aliyunOpen.Config{ AccessKeyId: tea.String(accessKeyId), AccessKeySecret: tea.String(accessKeySecret), } @@ -99,7 +99,7 @@ func (d *AliyunCLBDeployer) createSdkClient(accessKeyId, accessKeySecret, region } aConfig.Endpoint = tea.String(endpoint) - client, err := slb20140515.NewClient(aConfig) + client, err := aliyunSlb.NewClient(aConfig) if err != nil { return nil, err } @@ -117,7 +117,7 @@ func (d *AliyunCLBDeployer) deployToLoadbalancer(ctx context.Context) error { // 查询负载均衡实例的详细信息 // REF: https://help.aliyun.com/zh/slb/classic-load-balancer/developer-reference/api-slb-2014-05-15-describeloadbalancerattribute - describeLoadBalancerAttributeReq := &slb20140515.DescribeLoadBalancerAttributeRequest{ + describeLoadBalancerAttributeReq := &aliyunSlb.DescribeLoadBalancerAttributeRequest{ RegionId: tea.String(d.option.DeployConfig.GetConfigAsString("region")), LoadBalancerId: tea.String(aliLoadbalancerId), } @@ -134,7 +134,7 @@ func (d *AliyunCLBDeployer) deployToLoadbalancer(ctx context.Context) error { listListenersLimit := int32(100) var listListenersToken *string = nil for { - describeLoadBalancerListenersReq := &slb20140515.DescribeLoadBalancerListenersRequest{ + describeLoadBalancerListenersReq := &aliyunSlb.DescribeLoadBalancerListenersRequest{ RegionId: tea.String(d.option.DeployConfig.GetConfigAsString("region")), MaxResults: tea.Int32(listListenersLimit), NextToken: listListenersToken, @@ -214,7 +214,7 @@ func (d *AliyunCLBDeployer) deployToListener(ctx context.Context) error { func (d *AliyunCLBDeployer) updateListenerCertificate(ctx context.Context, aliLoadbalancerId string, aliListenerPort int32, aliCertId string) error { // 查询监听配置 // REF: https://help.aliyun.com/zh/slb/classic-load-balancer/developer-reference/api-slb-2014-05-15-describeloadbalancerhttpslistenerattribute - describeLoadBalancerHTTPSListenerAttributeReq := &slb20140515.DescribeLoadBalancerHTTPSListenerAttributeRequest{ + describeLoadBalancerHTTPSListenerAttributeReq := &aliyunSlb.DescribeLoadBalancerHTTPSListenerAttributeRequest{ LoadBalancerId: tea.String(aliLoadbalancerId), ListenerPort: tea.Int32(aliListenerPort), } @@ -227,7 +227,7 @@ func (d *AliyunCLBDeployer) updateListenerCertificate(ctx context.Context, aliLo // 查询扩展域名 // REF: https://help.aliyun.com/zh/slb/classic-load-balancer/developer-reference/api-slb-2014-05-15-describedomainextensions - describeDomainExtensionsReq := &slb20140515.DescribeDomainExtensionsRequest{ + describeDomainExtensionsReq := &aliyunSlb.DescribeDomainExtensionsRequest{ RegionId: tea.String(d.option.DeployConfig.GetConfigAsString("region")), LoadBalancerId: tea.String(aliLoadbalancerId), ListenerPort: tea.Int32(aliListenerPort), @@ -249,7 +249,7 @@ func (d *AliyunCLBDeployer) updateListenerCertificate(ctx context.Context, aliLo break } - setDomainExtensionAttributeReq := &slb20140515.SetDomainExtensionAttributeRequest{ + setDomainExtensionAttributeReq := &aliyunSlb.SetDomainExtensionAttributeRequest{ RegionId: tea.String(d.option.DeployConfig.GetConfigAsString("region")), DomainExtensionId: tea.String(*domainExtension.DomainExtensionId), ServerCertificateId: tea.String(aliCertId), @@ -265,7 +265,7 @@ func (d *AliyunCLBDeployer) updateListenerCertificate(ctx context.Context, aliLo // REF: https://help.aliyun.com/zh/slb/classic-load-balancer/developer-reference/api-slb-2014-05-15-setloadbalancerhttpslistenerattribute // // 注意修改监听配置要放在修改扩展域名之后 - setLoadBalancerHTTPSListenerAttributeReq := &slb20140515.SetLoadBalancerHTTPSListenerAttributeRequest{ + setLoadBalancerHTTPSListenerAttributeReq := &aliyunSlb.SetLoadBalancerHTTPSListenerAttributeRequest{ RegionId: tea.String(d.option.DeployConfig.GetConfigAsString("region")), LoadBalancerId: tea.String(aliLoadbalancerId), ListenerPort: tea.Int32(aliListenerPort), diff --git a/internal/deployer/aliyun_dcdn.go b/internal/deployer/aliyun_dcdn.go new file mode 100644 index 00000000..f760e92f --- /dev/null +++ b/internal/deployer/aliyun_dcdn.go @@ -0,0 +1,94 @@ +package deployer + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client" + aliyunDcdn "github.com/alibabacloud-go/dcdn-20180115/v3/client" + "github.com/alibabacloud-go/tea/tea" + + "github.com/usual2970/certimate/internal/domain" + "github.com/usual2970/certimate/internal/utils/rand" +) + +type AliyunDCDNDeployer struct { + option *DeployerOption + infos []string + + sdkClient *aliyunDcdn.Client +} + +func NewAliyunDCDNDeployer(option *DeployerOption) (Deployer, error) { + access := &domain.AliyunAccess{} + json.Unmarshal([]byte(option.Access), access) + + client, err := (&AliyunDCDNDeployer{}).createSdkClient( + access.AccessKeyId, + access.AccessKeySecret, + ) + if err != nil { + return nil, err + } + + return &AliyunDCDNDeployer{ + option: option, + infos: make([]string, 0), + sdkClient: client, + }, nil +} + +func (d *AliyunDCDNDeployer) GetID() string { + return fmt.Sprintf("%s-%s", d.option.AccessRecord.GetString("name"), d.option.AccessRecord.Id) +} + +func (d *AliyunDCDNDeployer) GetInfo() []string { + return d.infos +} + +func (d *AliyunDCDNDeployer) Deploy(ctx context.Context) error { + certName := fmt.Sprintf("%s-%s-%s", d.option.Domain, d.option.DomainId, rand.RandStr(6)) + + // 支持泛解析域名,在 Aliyun DCDN 中泛解析域名表示为 .example.com + domain := d.option.DeployConfig.GetConfigAsString("domain") + if strings.HasPrefix(domain, "*") { + domain = strings.TrimPrefix(domain, "*") + } + + // 配置域名证书 + // REF: https://help.aliyun.com/zh/edge-security-acceleration/dcdn/developer-reference/api-dcdn-2018-01-15-setdcdndomainsslcertificate + setDcdnDomainSSLCertificateReq := &aliyunDcdn.SetDcdnDomainSSLCertificateRequest{ + DomainName: tea.String(domain), + CertRegion: tea.String(d.option.DeployConfig.GetConfigOrDefaultAsString("region", "cn-hangzhou")), + CertName: tea.String(certName), + CertType: tea.String("upload"), + SSLProtocol: tea.String("on"), + SSLPub: tea.String(d.option.Certificate.Certificate), + SSLPri: tea.String(d.option.Certificate.PrivateKey), + } + setDcdnDomainSSLCertificateResp, err := d.sdkClient.SetDcdnDomainSSLCertificate(setDcdnDomainSSLCertificateReq) + if err != nil { + return fmt.Errorf("failed to execute sdk request 'dcdn.SetDcdnDomainSSLCertificate': %w", err) + } + + d.infos = append(d.infos, toStr("已配置 DCDN 域名证书", setDcdnDomainSSLCertificateResp)) + + return nil +} + +func (d *AliyunDCDNDeployer) createSdkClient(accessKeyId, accessKeySecret string) (*aliyunDcdn.Client, error) { + aConfig := &aliyunOpen.Config{ + AccessKeyId: tea.String(accessKeyId), + AccessKeySecret: tea.String(accessKeySecret), + Endpoint: tea.String("dcdn.aliyuncs.com"), + } + + client, err := aliyunDcdn.NewClient(aConfig) + if err != nil { + return nil, err + } + + return client, nil +} diff --git a/internal/deployer/aliyun_esa.go b/internal/deployer/aliyun_esa.go deleted file mode 100644 index 012ca887..00000000 --- a/internal/deployer/aliyun_esa.go +++ /dev/null @@ -1,97 +0,0 @@ -/* - * @Author: Bin - * @Date: 2024-09-17 - * @FilePath: /certimate/internal/deployer/aliyun_esa.go - */ -package deployer - -import ( - "context" - "encoding/json" - "fmt" - "strings" - - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" - dcdn20180115 "github.com/alibabacloud-go/dcdn-20180115/v3/client" - util "github.com/alibabacloud-go/tea-utils/v2/service" - "github.com/alibabacloud-go/tea/tea" - - "github.com/usual2970/certimate/internal/domain" - "github.com/usual2970/certimate/internal/utils/rand" -) - -type AliyunESADeployer struct { - client *dcdn20180115.Client - option *DeployerOption - infos []string -} - -func NewAliyunESADeployer(option *DeployerOption) (*AliyunESADeployer, error) { - access := &domain.AliyunAccess{} - json.Unmarshal([]byte(option.Access), access) - - d := &AliyunESADeployer{ - option: option, - } - - client, err := d.createClient(access.AccessKeyId, access.AccessKeySecret) - if err != nil { - return nil, err - } - - return &AliyunESADeployer{ - client: client, - option: option, - infos: make([]string, 0), - }, nil -} - -func (d *AliyunESADeployer) GetID() string { - return fmt.Sprintf("%s-%s", d.option.AccessRecord.GetString("name"), d.option.AccessRecord.Id) -} - -func (d *AliyunESADeployer) GetInfo() []string { - return d.infos -} - -func (d *AliyunESADeployer) Deploy(ctx context.Context) error { - certName := fmt.Sprintf("%s-%s-%s", d.option.Domain, d.option.DomainId, rand.RandStr(6)) - - // 支持泛解析域名,在 Aliyun DCND 中泛解析域名表示为 .example.com - domain := getDeployString(d.option.DeployConfig, "domain") - if strings.HasPrefix(domain, "*") { - domain = strings.TrimPrefix(domain, "*") - } - - setDcdnDomainSSLCertificateRequest := &dcdn20180115.SetDcdnDomainSSLCertificateRequest{ - DomainName: tea.String(domain), - CertName: tea.String(certName), - CertType: tea.String("upload"), - SSLProtocol: tea.String("on"), - SSLPub: tea.String(d.option.Certificate.Certificate), - SSLPri: tea.String(d.option.Certificate.PrivateKey), - CertRegion: tea.String("cn-hangzhou"), - } - - runtime := &util.RuntimeOptions{} - - resp, err := d.client.SetDcdnDomainSSLCertificateWithOptions(setDcdnDomainSSLCertificateRequest, runtime) - if err != nil { - return err - } - - d.infos = append(d.infos, toStr("dcdn设置证书", resp)) - - return nil -} - -func (d *AliyunESADeployer) createClient(accessKeyId, accessKeySecret string) (_result *dcdn20180115.Client, _err error) { - config := &openapi.Config{ - AccessKeyId: tea.String(accessKeyId), - AccessKeySecret: tea.String(accessKeySecret), - } - config.Endpoint = tea.String("dcdn.aliyuncs.com") - _result = &dcdn20180115.Client{} - _result, _err = dcdn20180115.NewClient(config) - return _result, _err -} diff --git a/internal/deployer/aliyun_nlb.go b/internal/deployer/aliyun_nlb.go index 514657e6..59cc0163 100644 --- a/internal/deployer/aliyun_nlb.go +++ b/internal/deployer/aliyun_nlb.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" - nlb20220430 "github.com/alibabacloud-go/nlb-20220430/v2/client" + aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client" + aliyunNlb "github.com/alibabacloud-go/nlb-20220430/v2/client" "github.com/alibabacloud-go/tea/tea" "github.com/usual2970/certimate/internal/domain" @@ -18,7 +18,7 @@ type AliyunNLBDeployer struct { option *DeployerOption infos []string - sdkClient *nlb20220430.Client + sdkClient *aliyunNlb.Client sslUploader uploader.Uploader } @@ -77,12 +77,12 @@ func (d *AliyunNLBDeployer) Deploy(ctx context.Context) error { return nil } -func (d *AliyunNLBDeployer) createSdkClient(accessKeyId, accessKeySecret, region string) (*nlb20220430.Client, error) { +func (d *AliyunNLBDeployer) createSdkClient(accessKeyId, accessKeySecret, region string) (*aliyunNlb.Client, error) { if region == "" { region = "cn-hangzhou" // NLB 服务默认区域:华东一杭州 } - aConfig := &openapi.Config{ + aConfig := &aliyunOpen.Config{ AccessKeyId: tea.String(accessKeyId), AccessKeySecret: tea.String(accessKeySecret), } @@ -94,7 +94,7 @@ func (d *AliyunNLBDeployer) createSdkClient(accessKeyId, accessKeySecret, region } aConfig.Endpoint = tea.String(endpoint) - client, err := nlb20220430.NewClient(aConfig) + client, err := aliyunNlb.NewClient(aConfig) if err != nil { return nil, err } @@ -112,7 +112,7 @@ func (d *AliyunNLBDeployer) deployToLoadbalancer(ctx context.Context) error { // 查询负载均衡实例的详细信息 // REF: https://help.aliyun.com/zh/slb/network-load-balancer/developer-reference/api-nlb-2022-04-30-getloadbalancerattribute - getLoadBalancerAttributeReq := &nlb20220430.GetLoadBalancerAttributeRequest{ + getLoadBalancerAttributeReq := &aliyunNlb.GetLoadBalancerAttributeRequest{ LoadBalancerId: tea.String(aliLoadbalancerId), } getLoadBalancerAttributeResp, err := d.sdkClient.GetLoadBalancerAttribute(getLoadBalancerAttributeReq) @@ -128,7 +128,7 @@ func (d *AliyunNLBDeployer) deployToLoadbalancer(ctx context.Context) error { listListenersLimit := int32(100) var listListenersToken *string = nil for { - listListenersReq := &nlb20220430.ListListenersRequest{ + listListenersReq := &aliyunNlb.ListListenersRequest{ MaxResults: tea.Int32(listListenersLimit), NextToken: listListenersToken, LoadBalancerIds: []*string{tea.String(aliLoadbalancerId)}, @@ -202,7 +202,7 @@ func (d *AliyunNLBDeployer) deployToListener(ctx context.Context) error { func (d *AliyunNLBDeployer) updateListenerCertificate(ctx context.Context, aliListenerId string, aliCertId string) error { // 查询监听的属性 // REF: https://help.aliyun.com/zh/slb/network-load-balancer/developer-reference/api-nlb-2022-04-30-getlistenerattribute - getListenerAttributeReq := &nlb20220430.GetListenerAttributeRequest{ + getListenerAttributeReq := &aliyunNlb.GetListenerAttributeRequest{ ListenerId: tea.String(aliListenerId), } getListenerAttributeResp, err := d.sdkClient.GetListenerAttribute(getListenerAttributeReq) @@ -214,7 +214,7 @@ func (d *AliyunNLBDeployer) updateListenerCertificate(ctx context.Context, aliLi // 修改监听的属性 // REF: https://help.aliyun.com/zh/slb/network-load-balancer/developer-reference/api-nlb-2022-04-30-updatelistenerattribute - updateListenerAttributeReq := &nlb20220430.UpdateListenerAttributeRequest{ + updateListenerAttributeReq := &aliyunNlb.UpdateListenerAttributeRequest{ ListenerId: tea.String(aliListenerId), CertificateIds: []*string{tea.String(aliCertId)}, } diff --git a/internal/deployer/aliyun_oss.go b/internal/deployer/aliyun_oss.go index 9626e3bc..47173d0e 100644 --- a/internal/deployer/aliyun_oss.go +++ b/internal/deployer/aliyun_oss.go @@ -3,6 +3,7 @@ package deployer import ( "context" "encoding/json" + "errors" "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" @@ -11,27 +12,30 @@ import ( ) type AliyunOSSDeployer struct { - client *oss.Client option *DeployerOption infos []string + + sdkClient *oss.Client } func NewAliyunOSSDeployer(option *DeployerOption) (Deployer, error) { access := &domain.AliyunAccess{} json.Unmarshal([]byte(option.Access), access) - d := &AliyunOSSDeployer{ - option: option, - infos: make([]string, 0), - } - - client, err := d.createClient(access.AccessKeyId, access.AccessKeySecret) + client, err := (&AliyunOSSDeployer{}).createSdkClient( + access.AccessKeyId, + access.AccessKeySecret, + option.DeployConfig.GetConfigAsString("endpoint"), + ) if err != nil { return nil, err } - d.client = client - return d, nil + return &AliyunOSSDeployer{ + option: option, + infos: make([]string, 0), + sdkClient: client, + }, nil } func (d *AliyunOSSDeployer) GetID() string { @@ -43,8 +47,15 @@ func (d *AliyunOSSDeployer) GetInfo() []string { } func (d *AliyunOSSDeployer) Deploy(ctx context.Context) error { - err := d.client.PutBucketCnameWithCertificate(getDeployString(d.option.DeployConfig, "bucket"), oss.PutBucketCname{ - Cname: getDeployString(d.option.DeployConfig, "domain"), + aliBucket := d.option.DeployConfig.GetConfigAsString("bucket") + if aliBucket == "" { + return errors.New("`bucket` is required") + } + + // 为存储空间绑定自定义域名 + // REF: https://help.aliyun.com/zh/oss/developer-reference/putcname + err := d.sdkClient.PutBucketCnameWithCertificate(aliBucket, oss.PutBucketCname{ + Cname: d.option.DeployConfig.GetConfigAsString("domain"), CertificateConfiguration: &oss.CertificateConfiguration{ Certificate: d.option.Certificate.Certificate, PrivateKey: d.option.Certificate.PrivateKey, @@ -52,19 +63,21 @@ func (d *AliyunOSSDeployer) Deploy(ctx context.Context) error { }, }) if err != nil { - return fmt.Errorf("deploy aliyun oss error: %w", err) + return fmt.Errorf("failed to execute sdk request 'oss.PutBucketCnameWithCertificate': %w", err) } + return nil } -func (d *AliyunOSSDeployer) createClient(accessKeyId, accessKeySecret string) (*oss.Client, error) { - client, err := oss.New( - getDeployString(d.option.DeployConfig, "endpoint"), - accessKeyId, - accessKeySecret, - ) - if err != nil { - return nil, fmt.Errorf("create aliyun client error: %w", err) +func (d *AliyunOSSDeployer) createSdkClient(accessKeyId, accessKeySecret, endpoint string) (*oss.Client, error) { + if endpoint == "" { + endpoint = "oss.aliyuncs.com" } + + client, err := oss.New(endpoint, accessKeyId, accessKeySecret) + if err != nil { + return nil, err + } + return client, nil } diff --git a/internal/deployer/deployer.go b/internal/deployer/deployer.go index c4530df4..eae80d5a 100644 --- a/internal/deployer/deployer.go +++ b/internal/deployer/deployer.go @@ -17,7 +17,7 @@ import ( const ( targetAliyunOSS = "aliyun-oss" targetAliyunCDN = "aliyun-cdn" - targetAliyunESA = "aliyun-dcdn" + targetAliyunDCDN = "aliyun-dcdn" targetAliyunCLB = "aliyun-clb" targetAliyunALB = "aliyun-alb" targetAliyunNLB = "aliyun-nlb" @@ -109,8 +109,8 @@ func getWithDeployConfig(record *models.Record, cert *applicant.Certificate, dep return NewAliyunOSSDeployer(option) case targetAliyunCDN: return NewAliyunCDNDeployer(option) - case targetAliyunESA: - return NewAliyunESADeployer(option) + case targetAliyunDCDN: + return NewAliyunDCDNDeployer(option) case targetAliyunCLB: return NewAliyunCLBDeployer(option) case targetAliyunALB: @@ -118,7 +118,7 @@ func getWithDeployConfig(record *models.Record, cert *applicant.Certificate, dep case targetAliyunNLB: return NewAliyunNLBDeployer(option) case targetTencentCDN: - return NewTencentCDNDeployer(option) + return NewTencentCDNDeployer(option) case targetTencentECDN: return NewTencentECDNDeployer(option) case targetTencentCLB: diff --git a/internal/deployer/k8s_secret.go b/internal/deployer/k8s_secret.go index dfc56889..6468a0d2 100644 --- a/internal/deployer/k8s_secret.go +++ b/internal/deployer/k8s_secret.go @@ -6,8 +6,8 @@ import ( "fmt" "strings" - corev1 "k8s.io/api/core/v1" - k8sMetaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" + k8sCore "k8s.io/api/core/v1" + k8sMeta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" @@ -49,46 +49,46 @@ func (d *K8sSecretDeployer) Deploy(ctx context.Context) error { d.infos = append(d.infos, toStr("kubeClient create success.", nil)) - namespace := getDeployString(d.option.DeployConfig, "namespace") + namespace := d.option.DeployConfig.GetConfigAsString("namespace") if namespace == "" { namespace = "default" } - secretName := getDeployString(d.option.DeployConfig, "secretName") + secretName := d.option.DeployConfig.GetConfigAsString("secretName") if secretName == "" { return fmt.Errorf("k8s secret name is empty") } - secretDataKeyForCrt := getDeployString(d.option.DeployConfig, "secretDataKeyForCrt") + secretDataKeyForCrt := d.option.DeployConfig.GetConfigAsString("secretDataKeyForCrt") if secretDataKeyForCrt == "" { namespace = "tls.crt" } - secretDataKeyForKey := getDeployString(d.option.DeployConfig, "secretDataKeyForKey") + secretDataKeyForKey := d.option.DeployConfig.GetConfigAsString("secretDataKeyForKey") if secretDataKeyForKey == "" { namespace = "tls.key" } - certificate, err := x509.ParseCertificateFromPEM(d.option.Certificate.Certificate) + certX509, err := x509.ParseCertificateFromPEM(d.option.Certificate.Certificate) if err != nil { return fmt.Errorf("failed to parse certificate: %w", err) } - secretPayload := corev1.Secret{ - TypeMeta: k8sMetaV1.TypeMeta{ + secretPayload := k8sCore.Secret{ + TypeMeta: k8sMeta.TypeMeta{ Kind: "Secret", APIVersion: "v1", }, - ObjectMeta: k8sMetaV1.ObjectMeta{ + ObjectMeta: k8sMeta.ObjectMeta{ Name: secretName, Annotations: map[string]string{ "certimate/domains": d.option.Domain, - "certimate/alt-names": strings.Join(certificate.DNSNames, ","), - "certimate/common-name": certificate.Subject.CommonName, - "certimate/issuer-organization": strings.Join(certificate.Issuer.Organization, ","), + "certimate/alt-names": strings.Join(certX509.DNSNames, ","), + "certimate/common-name": certX509.Subject.CommonName, + "certimate/issuer-organization": strings.Join(certX509.Issuer.Organization, ","), }, }, - Type: corev1.SecretType("kubernetes.io/tls"), + Type: k8sCore.SecretType("kubernetes.io/tls"), } secretPayload.Data = make(map[string][]byte) @@ -96,9 +96,9 @@ func (d *K8sSecretDeployer) Deploy(ctx context.Context) error { secretPayload.Data[secretDataKeyForKey] = []byte(d.option.Certificate.PrivateKey) // 获取 Secret 实例 - _, err = client.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, k8sMetaV1.GetOptions{}) + _, err = client.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, k8sMeta.GetOptions{}) if err != nil { - _, err = client.CoreV1().Secrets(namespace).Create(context.TODO(), &secretPayload, k8sMetaV1.CreateOptions{}) + _, err = client.CoreV1().Secrets(namespace).Create(context.TODO(), &secretPayload, k8sMeta.CreateOptions{}) if err != nil { return fmt.Errorf("failed to create k8s secret: %w", err) } else { @@ -108,7 +108,7 @@ func (d *K8sSecretDeployer) Deploy(ctx context.Context) error { } // 更新 Secret 实例 - _, err = client.CoreV1().Secrets(namespace).Update(ctx, &secretPayload, k8sMetaV1.UpdateOptions{}) + _, err = client.CoreV1().Secrets(namespace).Update(ctx, &secretPayload, k8sMeta.UpdateOptions{}) if err != nil { return fmt.Errorf("failed to update k8s secret: %w", err) } diff --git a/internal/pkg/core/uploader/uploader_aliyun_cas.go b/internal/pkg/core/uploader/uploader_aliyun_cas.go index b6a1f792..6a90331d 100644 --- a/internal/pkg/core/uploader/uploader_aliyun_cas.go +++ b/internal/pkg/core/uploader/uploader_aliyun_cas.go @@ -6,9 +6,8 @@ import ( "strings" "time" - cas20200407 "github.com/alibabacloud-go/cas-20200407/v3/client" - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" - util "github.com/alibabacloud-go/tea-utils/v2/service" + aliyunCas "github.com/alibabacloud-go/cas-20200407/v3/client" + aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client" "github.com/alibabacloud-go/tea/tea" "github.com/usual2970/certimate/internal/pkg/utils/x509" @@ -21,9 +20,8 @@ type AliyunCASUploaderConfig struct { } type AliyunCASUploader struct { - config *AliyunCASUploaderConfig - sdkClient *cas20200407.Client - sdkRuntime *util.RuntimeOptions + config *AliyunCASUploaderConfig + sdkClient *aliyunCas.Client } func NewAliyunCASUploader(config *AliyunCASUploaderConfig) (Uploader, error) { @@ -37,9 +35,8 @@ func NewAliyunCASUploader(config *AliyunCASUploaderConfig) (Uploader, error) { } return &AliyunCASUploader{ - config: config, - sdkClient: client, - sdkRuntime: &util.RuntimeOptions{}, + config: config, + sdkClient: client, }, nil } @@ -56,12 +53,12 @@ func (u *AliyunCASUploader) Upload(ctx context.Context, certPem string, privkeyP listUserCertificateOrderPage := int64(1) listUserCertificateOrderLimit := int64(50) for { - listUserCertificateOrderReq := &cas20200407.ListUserCertificateOrderRequest{ + listUserCertificateOrderReq := &aliyunCas.ListUserCertificateOrderRequest{ CurrentPage: tea.Int64(listUserCertificateOrderPage), ShowSize: tea.Int64(listUserCertificateOrderLimit), OrderType: tea.String("CERT"), } - listUserCertificateOrderResp, err := u.sdkClient.ListUserCertificateOrderWithOptions(listUserCertificateOrderReq, u.sdkRuntime) + listUserCertificateOrderResp, err := u.sdkClient.ListUserCertificateOrder(listUserCertificateOrderReq) if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'cas.ListUserCertificateOrder': %w", err) } @@ -69,10 +66,10 @@ func (u *AliyunCASUploader) Upload(ctx context.Context, certPem string, privkeyP if listUserCertificateOrderResp.Body.CertificateOrderList != nil { for _, certDetail := range listUserCertificateOrderResp.Body.CertificateOrderList { if strings.EqualFold(certX509.SerialNumber.Text(16), *certDetail.SerialNo) { - getUserCertificateDetailReq := &cas20200407.GetUserCertificateDetailRequest{ + getUserCertificateDetailReq := &aliyunCas.GetUserCertificateDetailRequest{ CertId: certDetail.CertificateId, } - getUserCertificateDetailResp, err := u.sdkClient.GetUserCertificateDetailWithOptions(getUserCertificateDetailReq, u.sdkRuntime) + getUserCertificateDetailResp, err := u.sdkClient.GetUserCertificateDetail(getUserCertificateDetailReq) if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'cas.GetUserCertificateDetail': %w", err) } @@ -116,12 +113,12 @@ func (u *AliyunCASUploader) Upload(ctx context.Context, certPem string, privkeyP // 上传新证书 // REF: https://help.aliyun.com/zh/ssl-certificate/developer-reference/api-cas-2020-04-07-uploadusercertificate - uploadUserCertificateReq := &cas20200407.UploadUserCertificateRequest{ + uploadUserCertificateReq := &aliyunCas.UploadUserCertificateRequest{ Name: tea.String(certName), Cert: tea.String(certPem), Key: tea.String(privkeyPem), } - uploadUserCertificateResp, err := u.sdkClient.UploadUserCertificateWithOptions(uploadUserCertificateReq, u.sdkRuntime) + uploadUserCertificateResp, err := u.sdkClient.UploadUserCertificate(uploadUserCertificateReq) if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'cas.UploadUserCertificate': %w", err) } @@ -133,12 +130,12 @@ func (u *AliyunCASUploader) Upload(ctx context.Context, certPem string, privkeyP }, nil } -func (u *AliyunCASUploader) createSdkClient(accessKeyId, accessKeySecret, region string) (*cas20200407.Client, error) { +func (u *AliyunCASUploader) createSdkClient(accessKeyId, accessKeySecret, region string) (*aliyunCas.Client, error) { if region == "" { region = "cn-hangzhou" // CAS 服务默认区域:华东一杭州 } - aConfig := &openapi.Config{ + aConfig := &aliyunOpen.Config{ AccessKeyId: tea.String(accessKeyId), AccessKeySecret: tea.String(accessKeySecret), } @@ -152,7 +149,7 @@ func (u *AliyunCASUploader) createSdkClient(accessKeyId, accessKeySecret, region } aConfig.Endpoint = tea.String(endpoint) - client, err := cas20200407.NewClient(aConfig) + client, err := aliyunCas.NewClient(aConfig) if err != nil { return nil, err } diff --git a/internal/pkg/core/uploader/uploader_aliyun_slb.go b/internal/pkg/core/uploader/uploader_aliyun_slb.go index 99f3c484..2028a04b 100644 --- a/internal/pkg/core/uploader/uploader_aliyun_slb.go +++ b/internal/pkg/core/uploader/uploader_aliyun_slb.go @@ -8,9 +8,8 @@ import ( "strings" "time" - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" - slb20140515 "github.com/alibabacloud-go/slb-20140515/v4/client" - util "github.com/alibabacloud-go/tea-utils/v2/service" + aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client" + aliyunSlb "github.com/alibabacloud-go/slb-20140515/v4/client" "github.com/alibabacloud-go/tea/tea" "github.com/usual2970/certimate/internal/pkg/utils/x509" @@ -23,9 +22,8 @@ type AliyunSLBUploaderConfig struct { } type AliyunSLBUploader struct { - config *AliyunSLBUploaderConfig - sdkClient *slb20140515.Client - sdkRuntime *util.RuntimeOptions + config *AliyunSLBUploaderConfig + sdkClient *aliyunSlb.Client } func NewAliyunSLBUploader(config *AliyunSLBUploaderConfig) (Uploader, error) { @@ -39,9 +37,8 @@ func NewAliyunSLBUploader(config *AliyunSLBUploaderConfig) (Uploader, error) { } return &AliyunSLBUploader{ - config: config, - sdkClient: client, - sdkRuntime: &util.RuntimeOptions{}, + config: config, + sdkClient: client, }, nil } @@ -54,10 +51,10 @@ func (u *AliyunSLBUploader) Upload(ctx context.Context, certPem string, privkeyP // 查询证书列表,避免重复上传 // REF: https://help.aliyun.com/zh/slb/classic-load-balancer/developer-reference/api-slb-2014-05-15-describeservercertificates - describeServerCertificatesReq := &slb20140515.DescribeServerCertificatesRequest{ + describeServerCertificatesReq := &aliyunSlb.DescribeServerCertificatesRequest{ RegionId: tea.String(u.config.Region), } - describeServerCertificatesResp, err := u.sdkClient.DescribeServerCertificatesWithOptions(describeServerCertificatesReq, u.sdkRuntime) + describeServerCertificatesResp, err := u.sdkClient.DescribeServerCertificates(describeServerCertificatesReq) if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'slb.DescribeServerCertificates': %w", err) } @@ -85,13 +82,13 @@ func (u *AliyunSLBUploader) Upload(ctx context.Context, certPem string, privkeyP // 上传新证书 // REF: https://help.aliyun.com/zh/slb/classic-load-balancer/developer-reference/api-slb-2014-05-15-uploadservercertificate - uploadServerCertificateReq := &slb20140515.UploadServerCertificateRequest{ + uploadServerCertificateReq := &aliyunSlb.UploadServerCertificateRequest{ RegionId: tea.String(u.config.Region), ServerCertificateName: tea.String(certName), ServerCertificate: tea.String(certPem), PrivateKey: tea.String(privkeyPem), } - uploadServerCertificateResp, err := u.sdkClient.UploadServerCertificateWithOptions(uploadServerCertificateReq, u.sdkRuntime) + uploadServerCertificateResp, err := u.sdkClient.UploadServerCertificate(uploadServerCertificateReq) if err != nil { return nil, fmt.Errorf("failed to execute sdk request 'slb.UploadServerCertificate': %w", err) } @@ -103,12 +100,12 @@ func (u *AliyunSLBUploader) Upload(ctx context.Context, certPem string, privkeyP }, nil } -func (u *AliyunSLBUploader) createSdkClient(accessKeyId, accessKeySecret, region string) (*slb20140515.Client, error) { +func (u *AliyunSLBUploader) createSdkClient(accessKeyId, accessKeySecret, region string) (*aliyunSlb.Client, error) { if region == "" { region = "cn-hangzhou" // SLB 服务默认区域:华东一杭州 } - aConfig := &openapi.Config{ + aConfig := &aliyunOpen.Config{ AccessKeyId: tea.String(accessKeyId), AccessKeySecret: tea.String(accessKeySecret), } @@ -125,7 +122,7 @@ func (u *AliyunSLBUploader) createSdkClient(accessKeyId, accessKeySecret, region } aConfig.Endpoint = tea.String(endpoint) - client, err := slb20140515.NewClient(aConfig) + client, err := aliyunSlb.NewClient(aConfig) if err != nil { return nil, err }