// 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) key, err := v.Load() if err != nil { key, err = acme.NewKey(v.KeySize) if err != nil { log.Fatal(err) } if err := v.Save(key); err != nil { log.Fatal(err) } } acc, err := acme.NewAccount(key) if err != nil { log.Fatal(err) } con, err := acme.NewContacts(v.Mail, v.Phone) if err != nil { log.Fatal(err) } log.Println("Register", con) err = prov.Register(acc, con) if err != nil { log.Fatal(err) } for _, v := range v.Domain { key, err := acme.NewKey(v.KeySize) if err != nil { log.Fatal(err) } des := acme.NewDesire(key, v.Altnames) 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) cert, err := prov.Bundle(acc, des) if err != nil { log.Fatal(err) } log.Println("Save", v.CrtFile, v.KeyFile) if err := v.Save(cert); err != nil { log.Fatal(err) } } } } }