gpt4 book ai didi

go - 是否可以使用 net/http 在 golang 中托管多个域 TLS?

转载 作者:IT老高 更新时间:2023-10-28 13:08:03 25 4
gpt4 key购买 nike

我有多个具有不同证书的域(比如说 abc.com 和 xyz.org)。是否可以使用基于主机名的 key 和证书而无需深入底层和 net.Listen 等。只需使用简单的 http.ListenAndServeTLS(...) 或类似的?基本上和nginx一样。

最佳答案

BuildNameToCertificate() 将从证书中嗅探主机名。如果没有匹配 SNI 信息,则它为 [0] 提供服务。 https://golang.org/src/crypto/tls/common.go?s=18204:18245#L947

Go 1.14 更新 - 见 https://github.com/golang/go/commit/eb93c684d40de4924fc0664d7d9e98a84d5a100b

package main

import (
"crypto/tls"
"net/http"
"time"

"log"
)

func myHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("tls"))
}

func main() {
t := log.Logger{}
var err error
tlsConfig := &tls.Config{}
tlsConfig.Certificates = make([]tls.Certificate, 3)
// go http server treats the 0'th key as a default fallback key
tlsConfig.Certificates[0], err = tls.LoadX509KeyPair("test0.pem", "key.pem")
if err != nil {
t.Fatal(err)
}
tlsConfig.Certificates[1], err = tls.LoadX509KeyPair("test1.pem", "key.pem")
if err != nil {
t.Fatal(err)
}
tlsConfig.Certificates[2], err = tls.LoadX509KeyPair("test2.pem", "key.pem")
if err != nil {
t.Fatal(err)
}

// as of go 1.14 this line is no longer needed
// load the certs as above and skip BuildNameToCertificate()
tlsConfig.BuildNameToCertificate()

http.HandleFunc("/", myHandler)
server := &http.Server{
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
TLSConfig: tlsConfig,
}

listener, err := tls.Listen("tcp", ":8443", tlsConfig)
if err != nil {
t.Fatal(err)
}
log.Fatal(server.Serve(listener))
}

关于go - 是否可以使用 net/http 在 golang 中托管多个域 TLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35641888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com