From 7c176298411989260d8cedbe1f89c7cbc45900e7 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Mon, 13 Jul 2015 19:30:27 -0600 Subject: [PATCH] add https server --- README.md | 4 +++- serve.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ebf3b5e..a9de572 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,9 @@ Run the server ```bash # Run the Code -go run serve.go --port 8443 --letsencrypt-dir=./etc/letsencrypt/live/ +go run serve.go \ + --port 8443 \ + --letsencrypt-path=./etc/letsencrypt/live/ ``` View it in your browser diff --git a/serve.go b/serve.go index ddca5c3..58afce1 100644 --- a/serve.go +++ b/serve.go @@ -1,9 +1,14 @@ package main import ( + "crypto/tls" "flag" "fmt" + "net" + "net/http" "os" + "path/filepath" + "strconv" "strings" ) @@ -15,6 +20,23 @@ func usage() { os.Exit(2) } +type myHandler struct{} + +func (m *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Print debug info + fmt.Println(r.Host) + fmt.Println(r.Method) + fmt.Println(r.RequestURI) + fmt.Println(r.URL) // has many keys, such as Query + for k, v := range r.Header { + fmt.Println(k, v) + } + fmt.Println(r.Body) + + // End the request + fmt.Fprintf(w, "Hi there, %s %q? Wow!\n\nWith Love,\n\t%s", r.Method, r.URL.Path[1:], r.Host) +} + func main() { flag.Usage = usage @@ -34,5 +56,33 @@ func main() { */ fmt.Printf("Loading Certificates %s/%s/{privkey.pem,fullchain.pem}\n", *certsPath, *defaultHost) + privkeyPath := filepath.Join(*certsPath, *defaultHost, "privkey.pem") + certPath := filepath.Join(*certsPath, *defaultHost, "fullchain.pem") + cert, err := tls.LoadX509KeyPair(certPath, privkeyPath) + if err != nil { + fmt.Fprintf(os.Stderr, "Couldn't load default certificates: %s\n", err) + os.Exit(1) + } + + addr := ":" + strconv.Itoa(int(*port)) + + conn, err := net.Listen("tcp", addr) + if nil != err { + fmt.Fprintf(os.Stderr, "Couldn't bind to TCP socket %q: %s\n", addr, err) + os.Exit(1) + } + + tlsConfig := new(tls.Config) + tlsConfig.Certificates = []tls.Certificate{cert} + tlsConfig.GetCertificate = func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) { + return &cert, nil + } + tlsListener := tls.NewListener(conn, tlsConfig) + + server := &http.Server{ + Addr: addr, + Handler: &myHandler{}, + } fmt.Printf("Listening on https://%s:%d\n", host, *port) + server.Serve(tlsListener) }