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

问题描述 投票:3回答:1

我正在使用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")
    }
}

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

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

security go
1个回答
4
投票

您可以构建自己的服务器对象,仍然可以调用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("", "")
© www.soinside.com 2019 - 2024. All rights reserved.