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

Ost*_*tad 12 https go http2

我有多个域(让我们说abc.com和xyz.org)与不同的证书.是否可以使用基于主机名的密钥和证书,而无需深入低级别和net.Listen等.只需使用简单的http.ListenAndServeTLS(...)或类似的?基本上就像nginx一样.

foo*_*foo 19

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

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)
    }
    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))
}
Run Code Online (Sandbox Code Playgroud)

  • 已通过工作示例进行了更正。这个更完整的示例正确创建了侦听器并启动了服务器。 (2认同)
  • 注意 tls.NameToCertificate 已弃用。NameToCertificate 仅允许将单个证书与给定名称关联。将该字段保留为零,让库从证书中选择第一个兼容链。 (2认同)