mirror of https://github.com/usual2970/certimate
				
				
				
			
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
package deployer
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"time"
 | 
						|
 | 
						|
	aliyunCdn "github.com/alibabacloud-go/cdn-20180510/v5/client"
 | 
						|
	aliyunOpen "github.com/alibabacloud-go/darabonba-openapi/v2/client"
 | 
						|
	"github.com/alibabacloud-go/tea/tea"
 | 
						|
	xerrors "github.com/pkg/errors"
 | 
						|
 | 
						|
	"github.com/usual2970/certimate/internal/domain"
 | 
						|
)
 | 
						|
 | 
						|
type AliyunCDNDeployer struct {
 | 
						|
	option *DeployerOption
 | 
						|
	infos  []string
 | 
						|
 | 
						|
	sdkClient *aliyunCdn.Client
 | 
						|
}
 | 
						|
 | 
						|
func NewAliyunCDNDeployer(option *DeployerOption) (Deployer, error) {
 | 
						|
	access := &domain.AliyunAccess{}
 | 
						|
	if err := json.Unmarshal([]byte(option.Access), access); err != nil {
 | 
						|
		return nil, xerrors.Wrap(err, "failed to get access")
 | 
						|
	}
 | 
						|
 | 
						|
	client, err := (&AliyunCDNDeployer{}).createSdkClient(
 | 
						|
		access.AccessKeyId,
 | 
						|
		access.AccessKeySecret,
 | 
						|
	)
 | 
						|
	if err != nil {
 | 
						|
		return nil, xerrors.Wrap(err, "failed to create sdk client")
 | 
						|
	}
 | 
						|
 | 
						|
	return &AliyunCDNDeployer{
 | 
						|
		option:    option,
 | 
						|
		infos:     make([]string, 0),
 | 
						|
		sdkClient: client,
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *AliyunCDNDeployer) GetID() string {
 | 
						|
	return fmt.Sprintf("%s-%s", d.option.AccessRecord.GetString("name"), d.option.AccessRecord.Id)
 | 
						|
}
 | 
						|
 | 
						|
func (d *AliyunCDNDeployer) GetInfos() []string {
 | 
						|
	return d.infos
 | 
						|
}
 | 
						|
 | 
						|
func (d *AliyunCDNDeployer) Deploy(ctx context.Context) error {
 | 
						|
	// 设置 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(fmt.Sprintf("certimate-%d", time.Now().UnixMilli())),
 | 
						|
		CertType:    tea.String("upload"),
 | 
						|
		SSLProtocol: tea.String("on"),
 | 
						|
		SSLPub:      tea.String(d.option.Certificate.Certificate),
 | 
						|
		SSLPri:      tea.String(d.option.Certificate.PrivateKey),
 | 
						|
	}
 | 
						|
	setCdnDomainSSLCertificateResp, err := d.sdkClient.SetCdnDomainSSLCertificate(setCdnDomainSSLCertificateReq)
 | 
						|
	if err != nil {
 | 
						|
		return xerrors.Wrap(err, "failed to execute sdk request 'cdn.SetCdnDomainSSLCertificate'")
 | 
						|
	}
 | 
						|
 | 
						|
	d.infos = append(d.infos, toStr("已设置 CDN 域名证书", setCdnDomainSSLCertificateResp))
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
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"),
 | 
						|
	}
 | 
						|
 | 
						|
	client, err := aliyunCdn.NewClient(aConfig)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	return client, nil
 | 
						|
}
 |