将证书和密钥作为字符串传递给ListenAndServeTLS

Fel*_*ipe 4 security go

我正在使用Go创建一个应用,并且正在尝试使用该ListenAndServeTLS功能启动https服务器。这是我的代码:

func StartServer() {
    defer config.CapturePanic()
    c := config.GetInstance()

    serverAddress := fmt.Sprintf(":%s", c.GetConfig().ServerPort)
    server := http.Server{Addr: serverAddress}

    log.Info("Starting local server")
    http.HandleFunc("/", login.Handler)
    http.HandleFunc("/login", login.Handler)
    http.HandleFunc("/settings", settings.Handler)

    //cert, _ := data.Asset("my-cert.pem")
    //key, _ := data.Asset("my-key.pem")
    err := server.ListenAndServeTLS("my-cert.crt", "my-cert.key")
    if err != nil {
        log.WithError(err).Fatal("Error stopping local server")
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我想将我的证书及其密钥嵌入我的可执行文件中,然后将它们server.ListeAndServeTLS作为字符串或字节数组传递给函数。但是,此函数不采用这些类型的参数。还有另一种方法吗?

注意:我知道在客户端应用程序中嵌入私钥是一种不好的做法,但是我在这里试图做的只是创建将以托管的配置网页https://localhost:8080

Mar*_*arc 5

您可以构建自己的服务器对象并仍然调用ListenAndServeTLS。由于您的tls配置具有证书,因此它将忽略传入的文件名。为了简洁起见,我省略了错误的回报,请不要:

// Generate a key pair from your pem-encoded cert and key ([]byte).
cert, err := tls.X509KeyPair(<cert contents>, <key contents>)

// Construct a tls.config
tlsConfig := &tls.Config{
  Certificates: []tls.Certificate{cert}
  // Other options
}

// Build a server:
server := http.Server{
    // Other options
    TLSConfig: tlsConfig,
}

// Finally: serve.
err = server.ListenAndServeTLS("", "")
Run Code Online (Sandbox Code Playgroud)