Skip to content

Commit 44076d8

Browse files
committed
refactor(aliyun): 增强阿里云提供商支持 CAS 和 ESA 服务
1 parent 937e129 commit 44076d8

File tree

15 files changed

+1327
-75
lines changed

15 files changed

+1327
-75
lines changed

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ provider:
5656
auth:
5757
accessKeyId: "your-aliyun-access-key-id"
5858
accessKeySecret: "your-aliyun-access-key-secret"
59+
# ESA 业务专用字段(仅在执行 ESA 业务时使用)
60+
esaSiteId: "your-esa-site-id"
5961

6062
- name: "qiniu"
6163
remark: "七牛云"
@@ -74,10 +76,15 @@ provider:
7476
>
7577
> | 服务商 | name 值 | 认证字段 |
7678
> | :----: | :------------: | :--------------------------: |
77-
> | 阿里云 | `aliyun` | accessKeyId, accessKeySecret |
79+
> | 阿里云 | `aliyun` | accessKeyId, accessKeySecret(ESA可选:esaSiteId) |
7880
> | 七牛云 | `qiniu` | accessKey, accessSecret |
7981
> | 腾讯云 | `cloudTencent` | secretId, secretKey |
8082

83+
> #### 阿里云 CAS/ESA 业务分离(无自动识别)
84+
>
85+
> - 选择“阿里云-CAS 上传证书”业务:调用 CAS `UploadUserCertificate`
86+
> - 选择“阿里云-ESA 上传证书”业务:调用 ESA `SetCertificate`(需要 `esaSiteId`)
87+
8188
### 3. 配置 Nginx
8289

8390
添加 HTTP-01 验证反向代理(用于证书申请):

go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ module github.com/https-cert/deploy
33
go 1.26
44

55
require (
6-
github.com/alibabacloud-go/cas-20200407/v4 v4.1.0
76
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.15
8-
github.com/alibabacloud-go/tea v1.4.0
97
github.com/alibabacloud-go/tea-utils/v2 v2.0.9
108
github.com/coder/websocket v1.8.14
119
github.com/qiniu/go-sdk/v7 v7.25.6
@@ -18,6 +16,7 @@ require (
1816
github.com/BurntSushi/toml v1.6.0 // indirect
1917
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect
2018
github.com/alibabacloud-go/debug v1.0.1 // indirect
19+
github.com/alibabacloud-go/tea v1.4.0 // indirect
2120
github.com/aliyun/credentials-go v1.4.11 // indirect
2221
github.com/clbanning/mxj/v2 v2.7.0 // indirect
2322
github.com/fsnotify/fsnotify v1.9.0 // indirect

go.sum

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,12 @@ github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do2
99
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
1010
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8=
1111
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g=
12-
github.com/alibabacloud-go/cas-20200407/v4 v4.1.0 h1:JldJ1EtKHzqZMQJkZaGKz4pI6TtbKCKTXNO/v2bVJ30=
13-
github.com/alibabacloud-go/cas-20200407/v4 v4.1.0/go.mod h1:q7X8C3NE71dRxR3YLwz/NESvE5X56RI2tGTJqODe7Zs=
1412
github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY=
1513
github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI=
1614
github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE=
1715
github.com/alibabacloud-go/darabonba-encode-util v0.0.2/go.mod h1:JiW9higWHYXm7F4PKuMgEUETNZasrDM6vqVr/Can7H8=
1816
github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIpjmafa0qOTp6udc=
1917
github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc=
20-
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.14/go.mod h1:lxFGfobinVsQ49ntjpgWghXmIF0/Sm4+wvBJ1h5RtaE=
2118
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.15 h1:Mubp9hXZMTPWZK+WxrR+kKOVFp4Q/PDZrIIM7ByXI9Y=
2219
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.15/go.mod h1:lxFGfobinVsQ49ntjpgWghXmIF0/Sm4+wvBJ1h5RtaE=
2320
github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg=

internal/client/business_executor.go

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,23 @@ func (be *BusinessExecutor) ExecuteBusiness(providerName string, executeBusinesT
5050
return fmt.Errorf("不支持的业务类型: %d", executeBusinesType)
5151
}
5252

53-
case "aliyun", "qiniu":
53+
case "aliyun":
54+
// 阿里云 CAS 与 ESA 业务显式分离,不做自动识别
55+
switch executeBusinesType {
56+
case deployPB.ExecuteBusinesType_EXECUTE_BUSINES_UPLOAD_CERT:
57+
return be.handleAliyunCertificateProvider(domain, remark, cert, key, aliyun.ServiceCAS)
58+
case deployPB.ExecuteBusinesType_EXECUTE_BUSINES_OSS:
59+
return be.handleAliyunCertificateProvider(domain, remark, cert, key, aliyun.ServiceESA)
60+
default:
61+
return fmt.Errorf("不支持的业务类型: %d", executeBusinesType)
62+
}
63+
64+
case "qiniu":
5465
// 上传证书到云服务商
5566
if executeBusinesType != deployPB.ExecuteBusinesType_EXECUTE_BUSINES_UPLOAD_CERT {
5667
return fmt.Errorf("不支持的业务类型: %d", executeBusinesType)
5768
}
58-
return be.handleCertificateProvider(providerName, remark, cert, key)
69+
return be.handleCertificateProvider(providerName, domain, remark, cert, key)
5970

6071
default:
6172
logger.Warn("不支持的提供商", "provider", providerName)
@@ -144,7 +155,7 @@ func (be *BusinessExecutor) handle1PanelCertificateDeploy(domain, downloadURL st
144155
}
145156

146157
// handleCertificateProvider 处理证书提供商的上传操作
147-
func (be *BusinessExecutor) handleCertificateProvider(providerName, remark, cert, key string) error {
158+
func (be *BusinessExecutor) handleCertificateProvider(providerName, domain, remark, cert, key string) error {
148159
// 获取 provider 实例
149160
providerHandler, err := be.getProviderHandler(providerName)
150161
if err != nil {
@@ -153,15 +164,51 @@ func (be *BusinessExecutor) handleCertificateProvider(providerName, remark, cert
153164
}
154165

155166
// 上传证书
156-
if err := providerHandler.UploadCertificate(remark, cert, key); err != nil {
167+
if err := providerHandler.UploadCertificate(remark, domain, cert, key); err != nil {
157168
logger.Error("上传证书失败", "provider", providerName, "error", err)
158169
return err
159170
}
160171

161-
logger.Info("证书上传成功", "provider", providerName, "remark", remark)
172+
logger.Info("证书上传成功", "provider", providerName, "remark", remark, "domain", domain)
173+
return nil
174+
}
175+
176+
// handleAliyunCertificateProvider 处理阿里云证书上传(CAS/ESA 显式分离)
177+
func (be *BusinessExecutor) handleAliyunCertificateProvider(domain, remark, cert, key, service string) error {
178+
providerHandler, err := be.getAliyunProvider(service)
179+
if err != nil {
180+
logger.Error("创建阿里云提供商实例失败", "service", service, "error", err)
181+
return err
182+
}
183+
184+
if err := providerHandler.UploadCertificate(remark, domain, cert, key); err != nil {
185+
logger.Error("上传阿里云证书失败", "service", service, "error", err)
186+
return err
187+
}
188+
189+
logger.Info("阿里云证书上传成功", "service", service, "remark", remark, "domain", domain)
162190
return nil
163191
}
164192

193+
func (be *BusinessExecutor) getAliyunProvider(service string) (providers.ProviderHandler, error) {
194+
providerConfig := config.GetProvider("aliyun")
195+
if providerConfig == nil {
196+
return nil, fmt.Errorf("未配置【阿里云】提供商配置")
197+
}
198+
199+
accessKeyId := providerConfig.GetAccessKeyId()
200+
accessKeySecret := providerConfig.GetAccessKeySecret()
201+
if accessKeyId == "" || accessKeySecret == "" {
202+
return nil, fmt.Errorf("阿里云配置不完整: accessKeyId 或 accessKeySecret 为空")
203+
}
204+
205+
options := &aliyun.Options{
206+
Service: service,
207+
ESASiteID: providerConfig.GetESASiteID(),
208+
}
209+
return aliyun.New(accessKeyId, accessKeySecret, options)
210+
}
211+
165212
// getProviderHandler 根据提供商名称获取对应的 handler
166213
func (be *BusinessExecutor) getProviderHandler(providerName string) (providers.ProviderHandler, error) {
167214
providerConfig := config.GetProvider(providerName)
@@ -170,14 +217,6 @@ func (be *BusinessExecutor) getProviderHandler(providerName string) (providers.P
170217
}
171218

172219
switch providerName {
173-
case "aliyun":
174-
accessKeyId := providerConfig.GetAccessKeyId()
175-
accessKeySecret := providerConfig.GetAccessKeySecret()
176-
if accessKeyId == "" || accessKeySecret == "" {
177-
return nil, fmt.Errorf("阿里云配置不完整: accessKeyId 或 accessKeySecret 为空")
178-
}
179-
return aliyun.New(accessKeyId, accessKeySecret)
180-
181220
case "qiniu":
182221
accessKey := providerConfig.GetAccessKey()
183222
accessSecret := providerConfig.GetAccessSecret()

internal/client/provider.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,47 @@ func TestProviderConnection(providerName string) (bool, error) {
4040
return false, fmt.Errorf("未配置【阿里云】提供商配置")
4141
}
4242

43-
provider, err := aliyun.New(providerConfig.GetAccessKeyId(), providerConfig.GetAccessKeySecret())
43+
casProvider, err := aliyun.New(providerConfig.GetAccessKeyId(), providerConfig.GetAccessKeySecret(), &aliyun.Options{
44+
Service: aliyun.ServiceCAS,
45+
})
46+
if err != nil {
47+
return false, fmt.Errorf("创建阿里云提供商实例失败: %w", err)
48+
}
49+
success, err := casProvider.TestConnection()
50+
if err == nil {
51+
return success, nil
52+
}
53+
54+
// CAS 测试失败时,如果配置了 ESA SiteId,补测 ESA 连接
55+
if providerConfig.GetESASiteID() != "" {
56+
esaProvider, esaErr := aliyun.New(providerConfig.GetAccessKeyId(), providerConfig.GetAccessKeySecret(), &aliyun.Options{
57+
Service: aliyun.ServiceESA,
58+
ESASiteID: providerConfig.GetESASiteID(),
59+
})
60+
if esaErr == nil {
61+
success, esaErr = esaProvider.TestConnection()
62+
if esaErr == nil {
63+
return success, nil
64+
}
65+
}
66+
return false, fmt.Errorf("阿里云连接测试失败(CAS: %v, ESA: %v)", err, esaErr)
67+
}
68+
69+
return false, fmt.Errorf("阿里云连接测试失败: %w", err)
70+
71+
case "aliyunEsa":
72+
providerConfig := config.GetProvider("aliyunEsa")
73+
if providerConfig == nil {
74+
providerConfig = config.GetProvider("aliyun")
75+
}
76+
if providerConfig == nil {
77+
return false, fmt.Errorf("未配置【阿里云 ESA】提供商配置")
78+
}
79+
80+
provider, err := aliyun.New(providerConfig.GetAccessKeyId(), providerConfig.GetAccessKeySecret(), &aliyun.Options{
81+
Service: aliyun.ServiceESA,
82+
ESASiteID: providerConfig.GetESASiteID(),
83+
})
4484
if err != nil {
4585
return false, fmt.Errorf("创建阿里云提供商实例失败: %w", err)
4686
}

0 commit comments

Comments
 (0)