dongyan4157
2016-02-26 01:42
浏览 122
已采纳

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

I have multiple domain (let's say abc.com and xyz.org) with diffrent certificate. Is it possible to use key and certificate based on hostname without going deep low level and net.Listen, etc. Just using simple http.ListenAndServeTLS(...) or similar ? Basically like what nginx does.

图片转代码服务由CSDN问答提供 功能建议

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • doulu8847 2016-02-26 02:23
    已采纳

    BuildNameToCertificate() will sniff the hostname from the cert. If none match the SNI info it serves the [0]. https://golang.org/src/crypto/tls/common.go?s=18204:18245#L947

    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))
    }
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题