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}
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 https
func 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
}