package ssl import ( "crypto" "github.com/1Panel-dev/1Panel/agent/app/dto" "github.com/1Panel-dev/1Panel/agent/app/model" "github.com/go-acme/lego/v4/certificate" "github.com/go-acme/lego/v4/challenge/dns01" "github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/providers/http/webroot" "github.com/pkg/errors" "os" ) type AcmeClientOption func(*AcmeClientOptions) type AcmeClientOptions struct { SystemProxy *dto.SystemProxy } type AcmeClient struct { Config *lego.Config Client *lego.Client User *AcmeUser ProxyURL string } func NewAcmeClient(acmeAccount *model.WebsiteAcmeAccount, systemProxy *dto.SystemProxy) (*AcmeClient, error) { if acmeAccount.Email == "" { return nil, errors.New("email can not blank") } client, err := NewRegisterClient(acmeAccount, systemProxy) if err != nil { return nil, err } return client, nil } func (c *AcmeClient) UseDns(dnsType DnsType, params string, websiteSSL model.WebsiteSSL) error { p, err := getDNSProviderConfig(dnsType, params) if err != nil { return err } var nameservers []string if websiteSSL.Nameserver1 != "" { nameservers = append(nameservers, websiteSSL.Nameserver1) } if websiteSSL.Nameserver2 != "" { nameservers = append(nameservers, websiteSSL.Nameserver2) } if websiteSSL.DisableCNAME { _ = os.Setenv("LEGO_DISABLE_CNAME_SUPPORT", "true") } else { _ = os.Setenv("LEGO_DISABLE_CNAME_SUPPORT", "false") } return c.Client.Challenge.SetDNS01Provider(p, dns01.CondOption(len(nameservers) > 0, dns01.AddRecursiveNameservers(nameservers)), dns01.CondOption(websiteSSL.SkipDNS, dns01.DisableAuthoritativeNssPropagationRequirement()), dns01.AddDNSTimeout(dnsTimeOut), ) } func (c *AcmeClient) UseHTTP(path string) error { httpProvider, err := webroot.NewHTTPProvider(path) if err != nil { return err } err = c.Client.Challenge.SetHTTP01Provider(httpProvider) if err != nil { return err } return nil } func (c *AcmeClient) ObtainSSL(domains []string, privateKey crypto.PrivateKey) (certificate.Resource, error) { request := certificate.ObtainRequest{ Domains: domains, Bundle: true, PrivateKey: privateKey, } certificates, err := c.Client.Certificate.Obtain(request) if err != nil { return certificate.Resource{}, err } return *certificates, nil } func (c *AcmeClient) RevokeSSL(pemSSL []byte) error { return c.Client.Certificate.Revoke(pemSSL) }