77 lines · 2.0 KB · Go
RawDownload
package main import (	"crypto/tls"	"errors"	"flag"	"net"	"strings" 	"github.com/dkumor/acmewrapper") var (	letsencrypt = flag.Bool("letsencrypt", false, "enable Let’s Encrypt")	domainname  = flag.String("domain", "", "domain for certificate")	sannames    = flag.String("sans", "", "comma-seperate list of subject alternate names for certificate")	certfile    = flag.String("cert", "", "TLS cert file path")	keyfile     = flag.String("key", "", "TLS key file path")	regfile     = flag.String("reg", "", "user registration file path")	privfile    = flag.String("priv", "", "user private key file path")	test        = flag.Bool("test", false, "Use the Let's Encrypt staging server")	acme        = flag.String("server", acmewrapper.DefaultServer, "The ACME server to use")	accept      = flag.Bool("accept", false, "Accept the ACME server's TOS?")	email       = flag.String("email", "", "The email to use when registering") 	ErrDisabled = errors.New("Let's Encrypt is disabled")) // setup a tls listener and config from let's encrypt settings.//// TODO(mischief): http redirect to httpsfunc doTLS(addr string) (net.Listener, *tls.Config, error) {	if *letsencrypt == false {		return nil, nil, ErrDisabled	} 	if *test {		*acme = "https://acme-staging.api.letsencrypt.org/directory"	} 	domains := []string{*domainname} 	if *sannames != "" {		sans := strings.Split(*sannames, ",")		domains = append(domains, sans...)	} 	aconf := acmewrapper.Config{		Address:          addr,		Domains:          domains,		Email:            *email,		TLSCertFile:      *certfile,		TLSKeyFile:       *keyfile,		RegistrationFile: *regfile,		PrivateKeyFile:   *privfile,		Server:           *acme,		TOSCallback:      acmewrapper.TOSAgree,	} 	if *accept == false {		aconf.TOSCallback = acmewrapper.TOSDecline	} 	w, err := acmewrapper.New(aconf)	if err != nil {		return nil, nil, err	} 	tlsconfig := w.TLSConfig() 	listener, err := tls.Listen("tcp", addr, tlsconfig)	if err != nil {		return nil, nil, err	} 	return listener, tlsconfig, nil}