mirror of https://github.com/allinssl/allinssl
104 lines
2.8 KiB
Go
104 lines
2.8 KiB
Go
package aliyun
|
||
|
||
import (
|
||
"ALLinSSL/backend/internal/access"
|
||
"encoding/json"
|
||
"fmt"
|
||
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
|
||
esa "github.com/alibabacloud-go/esa-20240910/v2/client"
|
||
util "github.com/alibabacloud-go/tea-utils/v2/service"
|
||
"github.com/alibabacloud-go/tea/tea"
|
||
"strconv"
|
||
)
|
||
|
||
// CreateEsaClient creates a new ESA client with the provided access key and secret.
|
||
func CreateEsaClient(accessKey, accessSecret string) (*esa.Client, error) {
|
||
config := &openapi.Config{
|
||
AccessKeyId: tea.String(accessKey),
|
||
AccessKeySecret: tea.String(accessSecret),
|
||
Endpoint: tea.String("esa.ap-southeast-1.aliyuncs.com"),
|
||
}
|
||
return esa.NewClient(config)
|
||
}
|
||
|
||
// UploadCertToESA uploads the certificate and private key to Alibaba Cloud ESA.
|
||
func UploadCertToESA(client *esa.Client, id int64, certPEM, privkeyPEM string) error {
|
||
req := esa.SetCertificateRequest{
|
||
SiteId: tea.Int64(id),
|
||
Type: tea.String("upload"),
|
||
Certificate: tea.String(certPEM),
|
||
PrivateKey: tea.String(privkeyPEM),
|
||
}
|
||
runtime := &util.RuntimeOptions{}
|
||
|
||
_, err := client.SetCertificateWithOptions(&req, runtime)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func DeployAliyunESA(cfg map[string]any) error {
|
||
cert, ok := cfg["certificate"].(map[string]any)
|
||
if !ok {
|
||
return fmt.Errorf("证书不存在")
|
||
}
|
||
var providerID string
|
||
switch v := cfg["provider_id"].(type) {
|
||
case float64:
|
||
providerID = strconv.Itoa(int(v))
|
||
case string:
|
||
providerID = v
|
||
default:
|
||
return fmt.Errorf("参数错误:provider_id")
|
||
}
|
||
//
|
||
providerData, err := access.GetAccess(providerID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
providerConfigStr, ok := providerData["config"].(string)
|
||
if !ok {
|
||
return fmt.Errorf("api配置错误")
|
||
}
|
||
// 解析 JSON 配置
|
||
var providerConfig map[string]string
|
||
err = json.Unmarshal([]byte(providerConfigStr), &providerConfig)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
switch cfg["site_id"].(type) {
|
||
case float64:
|
||
cfg["site_id"] = int64(cfg["site_id"].(float64))
|
||
case string:
|
||
siteID, err := strconv.ParseInt(cfg["site_id"].(string), 10, 64)
|
||
if err != nil {
|
||
return fmt.Errorf("site_id 格式错误: %w", err)
|
||
}
|
||
cfg["site_id"] = siteID
|
||
case int:
|
||
cfg["site_id"] = cfg["site_id"].(int64)
|
||
default:
|
||
return fmt.Errorf("site_id 格式错误")
|
||
}
|
||
|
||
client, err := CreateEsaClient(providerConfig["access_key_id"], providerConfig["access_key_secret"])
|
||
if err != nil {
|
||
return fmt.Errorf("创建 ESA 客户端失败: %w", err)
|
||
}
|
||
certPEM, ok := cert["cert"].(string)
|
||
if !ok {
|
||
return fmt.Errorf("证书内容不存在或格式错误")
|
||
}
|
||
privkeyPEM, ok := cert["key"].(string)
|
||
if !ok {
|
||
return fmt.Errorf("私钥内容不存在或格式错误")
|
||
}
|
||
err = UploadCertToESA(client, cfg["site_id"].(int64), certPEM, privkeyPEM)
|
||
if err != nil {
|
||
return fmt.Errorf("上传证书到 ESA 失败: %w", err)
|
||
}
|
||
return nil
|
||
}
|