#### Generated private key openssl genrsa -out server.key 2048 #### To generate a certificate openssl req -new -x509 -key server.key -out server.pem -days 3650 #### https ```go package main import ( "io" "net/http" "log" ) func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") } func main() { http.HandleFunc("/hello", HelloServer) err := http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } ``` Hint: visit, please do not forget to use https begins,otherwise chrome will download a file as follows: ```bash dotcoo-air:tls dotcoo$ cat /Users/dotcoo/Downloads/hello | xxd 0000000: 1503 0100 0202 0a ....... ``` #### TLS Server ```go package main import ( "log" "crypto/tls" "net" "bufio" ) func main() { log.SetFlags(log.Lshortfile) cer, err := tls.LoadX509KeyPair("server.pem", "server.key") if err != nil { log.Println(err) return } config := &tls.Config{Certificates: []tls.Certificate{cer}} ln, err := tls.Listen("tcp", ":443", config) if err != nil { log.Println(err) return } defer ln.Close() for { conn, err := ln.Accept() if err != nil { log.Println(err) continue } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() r := bufio.NewReader(conn) for { msg, err := r.ReadString('\n') if err != nil { log.Println(err) return } println(msg) n, err := conn.Write([]byte("world\n")) if err != nil { log.Println(n, err) return } } } ``` #### TLS Client ```go package main import ( "log" "crypto/tls" ) func main() { log.SetFlags(log.Lshortfile) conf := &tls.Config{ InsecureSkipVerify: true, } conn, err := tls.Dial("tcp", "127.0.0.1:8000", conf) if err != nil { log.Println(err) return } defer conn.Close() n, err := conn.Write([]byte("hello\n")) if err != nil { log.Println(n, err) return } buf := make([]byte, 100) n, err = conn.Read(buf) if err != nil { log.Println(n, err) return } println(string(buf[:n])) } ``` Links --- - http://superuser.com/a/226229/205366 - https://gist.github.com/spikebike/2232102 - http://echo.labstack.com/guide/