我正在使用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
托管的配置网页。
答案 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)
...