package acme import ( "crypto" "crypto/tls" ) type CSR struct { Resource Resource `json:"resource"` // new-cert CSR string `json:"csr"` } func (p *Provider) Bundle(key crypto.PrivateKey, altnames []string) (tls.Certificate, error) { cert := tls.Certificate{PrivateKey: key} csr, err := NewCSR(key, altnames) if err != nil { return cert, err } crt, up, err := p.RequestCert(csr) if err != nil { return cert, err } ca, err := p.GetCert(up) if err != nil { return cert, err } cert.Certificate = [][]byte{crt, ca} return cert, nil } func (p *Provider) RequestCert(csr string) ([]byte, string, error) { req := &CSR{ Resource: ResNewCert, CSR: csr, } resp, err := p.postJson(p.NewCert, req) if err != nil { return nil, "", err } ns := parseHeader(resp) crt, err := parseCert(resp) if err != nil { return nil, "", err } return crt, ns.Link["up"], nil } func (p *Provider) GetCert(uri string) ([]byte, error) { resp, err := p.Get(uri) if err != nil { return nil, err } return parseCert(resp) }