如何使用多个域监听和服务?我看到该函数接受一个证书和密钥文件,但我相信密钥文件可能只包含一个私钥。我有一些私钥,用于不同的证书链。
答案 0 :(得分:10)
http.ListenAndServeTLS
意味着提供一个简单的最小配置。如果您要添加其他选项,可以使用自定义http.Server
创建tls.Config
。然后,您可以在tls.Config.NameToCertificate
中手动映射名称,或者调用BuildNameToCertificate()
以编程方式构建地图。
但是,您仍然可以使用Server.ListenAndServeTLS
,因为它将在配置中加载证书以及通过方法args传入的证书。
cfg := &tls.Config{}
cert, err := tls.LoadX509KeyPair("cert_one.pem", "key_one.pem")
if err != nil {
log.Fatal(err)
}
cfg.Certificates = append(cfg.Certificates, cert)
// keep adding remaining certs to cfg.Certificates
cfg.BuildNameToCertificate()
server := http.Server{
Addr: "127.0.0.1:443",
Handler: myHandler,
TLSConfig: cfg,
}
server.ListenAndServeTLS("", "")
答案 1 :(得分:1)
我自己没有Go用户,但是如果你想在同一个TLS监听器上使用多个证书,你必须有一些方法来决定一旦客户端连接应该使用哪个证书,因为只有一个证书+链可以是在TLS握手内发送。
这个的主要用例是Server Name Indication (SNI)。使用SNI,您有多个证书,并且您希望根据客户在TLS握手中要求的名称选择合适的证书。
在go sni server中搜索this post from 2013结果。这篇文章表明,使用多个证书与ListenAndServeTLS不可能(或在2013年),但它也展示了如何实现必要的功能。