Skip to content

Instantly share code, notes, and snippets.

@kai5263499
Created November 10, 2017 16:38
Show Gist options
  • Save kai5263499/5e569f588ad583189e695dc6d7cfe192 to your computer and use it in GitHub Desktop.
Save kai5263499/5e569f588ad583189e695dc6d7cfe192 to your computer and use it in GitHub Desktop.
Serve TLS using an in-memory byte slice instead of a cert file
func ListenAndServeTLS(srv *http.Server, certPEMBlock, keyPEMBlock []byte) error {
addr := srv.Addr
if addr == "" {
addr = ":https"
}
config := &tls.Config{}
if srv.TLSConfig != nil {
*config = *srv.TLSConfig
}
if config.NextProtos == nil {
config.NextProtos = []string{"http/1.1"}
}
var err error
config.Certificates = make([]tls.Certificate, 1)
config.Certificates[0], err = tls.X509KeyPair(certPEMBlock, keyPEMBlock)
if err != nil {
return err
}
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
tlsListener := tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, config)
return srv.Serve(tlsListener)
}
type tcpKeepAliveListener struct {
*net.TCPListener
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment