// ACME CLI tool package main import ( "flag" "log" "dim13.org/acme" ) var confName = flag.String("conf", "", "configuration file") func main() { flag.Parse() conf, err := LoadConfig(*confName) if err != nil { log.Fatal(err) } var httpSol, tlsSol acme.Solver if conf.Listen != "" { httpSol, err = acme.NewHTTPSolver(conf.Listen) if err != nil { log.Println(err) } } if conf.ListenTLS != "" { tlsSol, err = acme.NewTLSSolver(conf.ListenTLS) if err != nil { log.Println(err) } } for _, v := range conf.Provider { log.Println("Dial", v.Directory) prov, err := acme.DialProvider(v.Directory) if err != nil { log.Fatal(err) } for _, v := range v.Account { log.Println("Load", v.KeyFile) acc, err := getAccount(v.KeyFile, v.KeySize) if err != nil { log.Fatal(err) } con := acme.Contacts{} con.AddMail(v.Mail) con.AddPhone(v.Phone) log.Println("Register", con) err = prov.Register(acc, con) if err != nil { log.Fatal(err) } for _, v := range v.Domain { des, err := acme.NewDesire(v.Altnames, v.KeySize) if err != nil { log.Fatal(err) } if v.Webroot != "" { sol := acme.NewWebrootSolver(v.Webroot) des.RegisterSolver(sol) } else if httpSol != nil { des.RegisterSolver(httpSol) } if tlsSol != nil { des.RegisterSolver(tlsSol) } if !des.HasSolver() { log.Fatal("no solver") } log.Println("Authorize", v.Altnames) if err := prov.Authorize(acc, des); err != nil { log.Fatal(err) } log.Println("Request bundle for", v.Altnames) if err := prov.Bundle(acc, des); err != nil { log.Fatal(err) } log.Println("Save", v.CrtFile, v.KeyFile) if err := des.SaveKeyPair(v.CrtFile, v.KeyFile); err != nil { log.Fatal(err) } } } } } func getAccount(keyFile string, keySize int) (*acme.Account, error) { acc, err := acme.LoadAccount(keyFile) if err == nil { return acc, nil } acc, err = acme.NewAccount(keySize) if err != nil { return nil, err } return acc, acc.Save(keyFile) }