修改申请证书

pull/135/head
zhangchenhao 2025-05-22 18:47:16 +08:00
parent 7b4c184ade
commit 6f3d4eb81f
6 changed files with 120 additions and 111 deletions

View File

@ -180,6 +180,7 @@ func AddEAB(c *gin.Context) {
Kid string `form:"Kid"` Kid string `form:"Kid"`
HmacEncoded string `form:"HmacEncoded"` HmacEncoded string `form:"HmacEncoded"`
CA string `form:"ca"` CA string `form:"ca"`
Mail string `form:"mail"`
} }
err := c.Bind(&form) err := c.Bind(&form)
if err != nil { if err != nil {
@ -190,6 +191,7 @@ func AddEAB(c *gin.Context) {
form.Kid = strings.TrimSpace(form.Kid) form.Kid = strings.TrimSpace(form.Kid)
form.HmacEncoded = strings.TrimSpace(form.HmacEncoded) form.HmacEncoded = strings.TrimSpace(form.HmacEncoded)
form.CA = strings.TrimSpace(form.CA) form.CA = strings.TrimSpace(form.CA)
form.Mail = strings.TrimSpace(form.Mail)
if form.Name == "" { if form.Name == "" {
public.FailMsg(c, "名称不能为空") public.FailMsg(c, "名称不能为空")
return return
@ -206,9 +208,14 @@ func AddEAB(c *gin.Context) {
public.FailMsg(c, "CA不能为空") public.FailMsg(c, "CA不能为空")
return return
} }
err = access.AddEAB(form.Name, form.Kid, form.HmacEncoded, form.CA) if form.Mail == "" {
public.FailMsg(c, "Email不能为空")
return
}
err = access.AddEAB(form.Name, form.Kid, form.HmacEncoded, form.CA, form.Mail)
if err != nil { if err != nil {
public.FailMsg(c, err.Error()) public.FailMsg(c, err.Error())
return
} }
public.SuccessMsg(c, "添加成功") public.SuccessMsg(c, "添加成功")
return return
@ -221,6 +228,7 @@ func UpdEAB(c *gin.Context) {
Kid string `form:"Kid"` Kid string `form:"Kid"`
HmacEncoded string `form:"HmacEncoded"` HmacEncoded string `form:"HmacEncoded"`
CA string `form:"ca"` CA string `form:"ca"`
Mail string `form:"mail"`
} }
err := c.Bind(&form) err := c.Bind(&form)
if err != nil { if err != nil {
@ -231,6 +239,7 @@ func UpdEAB(c *gin.Context) {
form.Kid = strings.TrimSpace(form.Kid) form.Kid = strings.TrimSpace(form.Kid)
form.HmacEncoded = strings.TrimSpace(form.HmacEncoded) form.HmacEncoded = strings.TrimSpace(form.HmacEncoded)
form.CA = strings.TrimSpace(form.CA) form.CA = strings.TrimSpace(form.CA)
form.Mail = strings.TrimSpace(form.Mail)
if form.Name == "" { if form.Name == "" {
public.FailMsg(c, "名称不能为空") public.FailMsg(c, "名称不能为空")
return return
@ -247,7 +256,11 @@ func UpdEAB(c *gin.Context) {
public.FailMsg(c, "CA不能为空") public.FailMsg(c, "CA不能为空")
return return
} }
err = access.UpdEAB(form.ID, form.Name, form.Kid, form.HmacEncoded, form.CA) if form.Mail == "" {
public.FailMsg(c, "mail不能为空")
return
}
err = access.UpdEAB(form.ID, form.Name, form.Kid, form.HmacEncoded, form.CA, form.Mail)
if err != nil { if err != nil {
public.FailMsg(c, err.Error()) public.FailMsg(c, err.Error())
} }
@ -313,6 +326,7 @@ func TestAccess(c *gin.Context) {
result = deploy.QiniuAPITest(form.ID) result = deploy.QiniuAPITest(form.ID)
default: default:
public.FailMsg(c, "不支持测试的提供商") public.FailMsg(c, "不支持测试的提供商")
return
} }
if result != nil { if result != nil {

View File

@ -62,7 +62,7 @@ func GetEABList(search string, p, limit int64) ([]map[string]any, int, error) {
return data, int(count), nil return data, int(count), nil
} }
func AddEAB(name, Kid, HmacEncoded, ca string) error { func AddEAB(name, Kid, HmacEncoded, ca, mail string) error {
s, err := GetSqliteEAB() s, err := GetSqliteEAB()
if err != nil { if err != nil {
return err return err
@ -76,11 +76,12 @@ func AddEAB(name, Kid, HmacEncoded, ca string) error {
"ca": ca, "ca": ca,
"update_time": now, "update_time": now,
"create_time": now, "create_time": now,
"mail": mail,
}) })
return err return err
} }
func UpdEAB(id, name, Kid, HmacEncoded, ca string) error { func UpdEAB(id, name, Kid, HmacEncoded, ca, mail string) error {
s, err := GetSqliteEAB() s, err := GetSqliteEAB()
if err != nil { if err != nil {
return err return err
@ -93,6 +94,7 @@ func UpdEAB(id, name, Kid, HmacEncoded, ca string) error {
"HmacEncoded": HmacEncoded, "HmacEncoded": HmacEncoded,
"ca": ca, "ca": ca,
"update_time": now, "update_time": now,
"mail": mail,
}) })
return err return err
} }
@ -113,7 +115,7 @@ func GetEAB(id string) (map[string]interface{}, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
s.Close() defer s.Close()
data, err := s.Where("id = ?", []interface{}{id}).Find() data, err := s.Where("id = ?", []interface{}{id}).Find()
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -98,7 +98,32 @@ func GetDNSProvider(providerName string, creds map[string]string) (challenge.Pro
} }
} }
func GetAcmeClient(db *public.Sqlite, email, algorithm, ca, proxy, eabId string, logger *public.Logger) (*lego.Client, error) { func GetAcmeClient(db *public.Sqlite, email, algorithm, proxy, eabId string, logger *public.Logger) (*lego.Client, error) {
var (
ca string
eabData map[string]any
err error
)
switch eabId {
case "let", "":
ca = "Let's Encrypt"
default:
eabData, err = access.GetEAB(eabId)
if err != nil {
return nil, err
}
if eabData == nil {
return nil, fmt.Errorf("未找到EAB信息")
}
if eabData["Kid"] == nil {
return nil, fmt.Errorf("Kid不能为空")
}
if eabData["HmacEncoded"] == nil {
return nil, fmt.Errorf("HmacEncoded不能为空")
}
ca = eabData["ca"].(string)
}
user, err := LoadUserFromDB(db, email, ca) user, err := LoadUserFromDB(db, email, ca)
if err != nil { if err != nil {
logger.Debug("acme账号不存在注册新账号") logger.Debug("acme账号不存在注册新账号")
@ -107,7 +132,7 @@ func GetAcmeClient(db *public.Sqlite, email, algorithm, ca, proxy, eabId string,
Email: email, Email: email,
key: privateKey, key: privateKey,
} }
}
config := lego.NewConfig(user) config := lego.NewConfig(user)
config.Certificate.KeyType = AlgorithmMap[algorithm] config.Certificate.KeyType = AlgorithmMap[algorithm]
config.CADirURL = CADirURLMap[ca] config.CADirURL = CADirURLMap[ca]
@ -129,40 +154,18 @@ func GetAcmeClient(db *public.Sqlite, email, algorithm, ca, proxy, eabId string,
if err != nil { if err != nil {
return nil, err return nil, err
} }
if user.Registration == nil {
logger.Debug("正在注册账号:" + email) logger.Debug("正在注册账号:" + email)
var reg *registration.Resource var reg *registration.Resource
switch ca { if eabData != nil {
case "Let's Encrypt": Kid := eabData["Kid"].(string)
reg, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
case "zerossl", "google":
// 获取EAB参数
var eabData map[string]any
if eabId == "" {
data, err := access.GetAllEAB(ca)
if err != nil {
return nil, err
}
if len(data) <= 0 {
return nil, fmt.Errorf("未找到EAB信息")
}
eabData = data[0]
} else {
eabData, err = access.GetEAB(eabId)
if err != nil {
return nil, err
}
if eabData == nil {
return nil, fmt.Errorf("未找到EAB信息")
}
}
Kid := eabData["kid"].(string)
HmacEncoded := eabData["HmacEncoded"].(string) HmacEncoded := eabData["HmacEncoded"].(string)
reg, err = client.Registration.RegisterWithExternalAccountBinding(registration.RegisterEABOptions{ reg, err = client.Registration.RegisterWithExternalAccountBinding(registration.RegisterEABOptions{
TermsOfServiceAgreed: true, TermsOfServiceAgreed: true,
Kid: Kid, Kid: Kid,
HmacEncoded: HmacEncoded, HmacEncoded: HmacEncoded,
}) })
default: } else {
reg, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true}) reg, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
} }
if err != nil { if err != nil {
@ -175,33 +178,8 @@ func GetAcmeClient(db *public.Sqlite, email, algorithm, ca, proxy, eabId string,
return nil, err return nil, err
} }
logger.Debug("acme账号注册并保存成功") logger.Debug("acme账号注册并保存成功")
return client, nil
} else {
config := lego.NewConfig(user)
config.Certificate.KeyType = AlgorithmMap[algorithm]
config.CADirURL = CADirURLMap[ca]
if proxy != "" {
// 构建代理 HTTP 客户端
proxyURL, err := url.Parse(proxy) // 替换为你的代理地址
if err != nil {
return nil, fmt.Errorf("无效的代理地址: %v", err)
}
httpClient := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxyURL),
},
Timeout: 30 * time.Second,
}
config.HTTPClient = httpClient
}
// 初始化 ACME 客户端
client, err := lego.NewClient(config)
if err != nil {
return nil, err
} }
return client, nil return client, nil
}
} }
func GetCert(runId string, domainArr []string, endDay int, logger *public.Logger) (map[string]any, error) { func GetCert(runId string, domainArr []string, endDay int, logger *public.Logger) (map[string]any, error) {
@ -305,10 +283,6 @@ func Apply(cfg map[string]any, logger *public.Logger) (map[string]any, error) {
if !ok { if !ok {
algorithm = "RSA2048" algorithm = "RSA2048"
} }
ca, ok := cfg["ca"].(string)
if !ok {
ca = "Let's Encrypt"
}
proxy, ok := cfg["proxy"].(string) proxy, ok := cfg["proxy"].(string)
if !ok { if !ok {
proxy = "" proxy = ""
@ -402,7 +376,7 @@ func Apply(cfg map[string]any, logger *public.Logger) (map[string]any, error) {
} }
logger.Debug("正在申请证书,域名: " + domains) logger.Debug("正在申请证书,域名: " + domains)
// 创建 ACME 客户端 // 创建 ACME 客户端
client, err := GetAcmeClient(db, email, algorithm, ca, proxy, eabId, logger) client, err := GetAcmeClient(db, email, algorithm, proxy, eabId, logger)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -31,6 +31,14 @@ func Deploy(cfg map[string]any, logger *public.Logger) error {
cfg["resource_type"] = "cos" cfg["resource_type"] = "cos"
logger.Debug("部署到腾讯云COS...") logger.Debug("部署到腾讯云COS...")
return DeployToTX(cfg) return DeployToTX(cfg)
case "tencentcloud-waf":
cfg["resource_type"] = "waf"
logger.Debug("部署到腾讯云WAF...")
return DeployToTX(cfg)
case "tencentcloud-teo":
cfg["resource_type"] = "teo"
logger.Debug("部署到腾讯云EdgeOne...")
return DeployToTX(cfg)
case "1panel": case "1panel":
logger.Debug("部署到1Panel...") logger.Debug("部署到1Panel...")
return Deploy1panel(cfg) return Deploy1panel(cfg)

View File

@ -29,6 +29,7 @@ func UploadToTX(client *ssl.Client, key, cert string) (string, error) {
request := ssl.NewUploadCertificateRequest() request := ssl.NewUploadCertificateRequest()
request.CertificatePublicKey = common.StringPtr(cert) request.CertificatePublicKey = common.StringPtr(cert)
request.CertificatePrivateKey = common.StringPtr(key) request.CertificatePrivateKey = common.StringPtr(key)
request.Repeatable = common.BoolPtr(false)
// 返回的resp是一个UploadCertificateResponse的实例与请求对象对应 // 返回的resp是一个UploadCertificateResponse的实例与请求对象对应
response, err := client.UploadCertificate(request) response, err := client.UploadCertificate(request)
if _, ok := err.(*errors.TencentCloudSDKError); ok { if _, ok := err.(*errors.TencentCloudSDKError); ok {
@ -94,15 +95,24 @@ func DeployToTX(cfg map[string]any) error {
request := ssl.NewDeployCertificateInstanceRequest() request := ssl.NewDeployCertificateInstanceRequest()
request.CertificateId = common.StringPtr(certificateId) request.CertificateId = common.StringPtr(certificateId)
if cfg["resource_type"] == "cdn" { resourceType := cfg["resource_type"].(string)
switch resourceType {
case "cdn", "waf", "teo":
domain, ok := cfg["domain"].(string) domain, ok := cfg["domain"].(string)
if !ok { if !ok {
return fmt.Errorf("参数错误domain") return fmt.Errorf("参数错误domain")
} }
request.InstanceIdList = common.StringPtrs([]string{domain}) domain = strings.TrimSpace(domain)
request.ResourceType = common.StringPtr("cdn") domainArray := strings.Split(domain, ",")
if len(domainArray) == 0 {
return fmt.Errorf("参数错误domain")
} }
if cfg["resource_type"] == "cos" { for i, d := range domainArray {
domainArray[i] = strings.TrimSpace(d)
}
request.InstanceIdList = common.StringPtrs(domainArray)
request.ResourceType = common.StringPtr(resourceType)
case "cos":
domain, ok := cfg["domain"].(string) domain, ok := cfg["domain"].(string)
if !ok { if !ok {
return fmt.Errorf("参数错误domain") return fmt.Errorf("参数错误domain")

View File

@ -187,7 +187,8 @@ func init() {
HmacEncoded TEXT not null, HmacEncoded TEXT not null,
ca TEXT not null, ca TEXT not null,
create_time TEXT, create_time TEXT,
update_time TEXT update_time TEXT,
mail TEXT not null
); );
`) `)