func (m *Manager) verify(host string) (cert *tls.Certificate, refreshTime time.Time, err error) { c, err := acme.NewClient(letsEncryptURL, &m.state, acme.EC256) if err != nil { return } if err = c.SetChallengeProvider(acme.TLSSNI01, tlsProvider{m}); err != nil { return } c.SetChallengeProvider(acme.TLSSNI01, tlsProvider{m}) c.ExcludeChallenges([]acme.Challenge{acme.HTTP01}) acmeCert, errmap := c.ObtainCertificate([]string{host}, true, nil) if len(errmap) > 0 { if debug { log.Printf("ObtainCertificate %v => %v", host, errmap) } err = fmt.Errorf("%v", errmap) return } entryCert := stateCert{ Cert: string(acmeCert.Certificate), Key: string(acmeCert.PrivateKey), } cert, err = entryCert.toTLS() if err != nil { if debug { log.Printf("ObtainCertificate %v toTLS failure: %v", host, err) } err = err return } if refreshTime, err = certRefreshTime(cert); err != nil { return } m.mu.Lock() if m.state.Certs == nil { m.state.Certs = make(map[string]stateCert) } m.state.Certs[host] = entryCert m.mu.Unlock() m.updated() return cert, refreshTime, nil }
func (m *Manager) register(email string, prompt func(string) bool) error { if m.registered() { return fmt.Errorf("already registered") } m.state.Email = email if m.state.key == nil { key, err := newKey() if err != nil { return fmt.Errorf("generating key: %v", err) } Key, err := marshalKey(key) if err != nil { return fmt.Errorf("generating key: %v", err) } m.state.key = key m.state.Key = string(Key) } c, err := acme.NewClient(letsEncryptURL, &m.state, acme.EC256) if err != nil { return fmt.Errorf("create client: %v", err) } reg, err := c.Register() if err != nil { return fmt.Errorf("register: %v", err) } m.state.Reg = reg if reg.Body.Agreement == "" { if prompt != nil && !prompt(reg.TosURL) { return fmt.Errorf("did not agree to TOS") } if err := c.AgreeToTOS(); err != nil { return fmt.Errorf("agreeing to TOS: %v", err) } } m.updated() return nil }