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

时间:2017-12-17 17:17:19

标签: 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")
    }
}

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

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

2 个答案:

答案 0 :(得分: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("", "")

答案 1 :(得分:0)

就我而言,我无法从磁盘加载文件,但是确实将证书作为变量([]byte传递到了环境中。

除了马克的答案,我只需要更改顶行。

// Append signed leaf certificate and intermediate to a single  
certChain := append(leaf.PublicBytes, intermediate.PublicBytes...)

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