// ACME CLI tool package main import ( "flag" "log" "os" "runtime/trace" "dim13.org/acme" ) var ( confName = flag.String("conf", "", "configuration file") tracing = flag.String("trace", "", "trace output file") ) func main() { flag.Parse() if *tracing != "" { f, err := os.Create(*tracing) if err != nil { log.Fatal(err) } trace.Start(f) defer trace.Stop() } 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 := acme.LoadAccount(v.KeyFile) if err != nil { log.Println("New", v.KeyFile) acc, err = acme.NewAccount(v.KeySize) if err != nil { log.Fatal(err) } if err := acc.Save(v.KeyFile); 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 { log.Println("Satisfice", v.Altnames) 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") } if err := prov.Authorize(acc, des); err != nil { log.Fatal(err) } if err := prov.Bundle(acc, des); err != nil { log.Fatal(err) } if err := des.SaveKeyPair(v.CrtFile, v.KeyFile); err != nil { log.Fatal(err) } } } } }