package acme import ( "crypto" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "io/ioutil" "log" "github.com/go-acme/lego/v4/certcrypto" "github.com/go-acme/lego/v4/certificate" "github.com/go-acme/lego/v4/challenge/http01" "github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/registration" ) // You'll need a user or account type that implements acme.User type MyUser struct { Email string Registration *registration.Resource key crypto.PrivateKey } func (u *MyUser) GetEmail() string { return u.Email } func (u MyUser) GetRegistration() *registration.Resource { return u.Registration } func (u *MyUser) GetPrivateKey() crypto.PrivateKey { return u.key } type ACMEHandler struct { email string domains []string } func NewACME(email string, domains []string) *ACMEHandler { return &ACMEHandler{ email: email, domains: domains, } } func (a *ACMEHandler) ObtainCert() { log.Println("Obtaining certificate...") // Create a user. New accounts need an email and private key to start. privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { log.Fatal(err) } adminUser := MyUser{ Email: a.email, key: privateKey, } config := lego.NewConfig(&adminUser) config.CADirURL = "https://acme-staging-v02.api.letsencrypt.org/directory" config.Certificate.KeyType = certcrypto.RSA2048 client, err := lego.NewClient(config) if err != nil { log.Println(err) } err = client.Challenge.SetHTTP01Provider(http01.NewProviderServer("", "5002")) if err != nil { log.Println(err) } // New users will need to register reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true}) if err != nil { log.Println(err) } adminUser.Registration = reg request := certificate.ObtainRequest{ Domains: a.domains, Bundle: true, } certificates, err := client.Certificate.Obtain(request) if err != nil { log.Println(err) } // Each certificate comes back with the cert bytes, the bytes of the client's // private key, and a certificate URL. SAVE THESE TO DISK. err = ioutil.WriteFile("./certs/"+certificates.Domain+".crt", certificates.Certificate, 0777) err = ioutil.WriteFile("./certs/"+certificates.Domain+".key", certificates.PrivateKey, 0777) if err != nil { log.Println(err) } // ... all done. }