带有多个证书的http.ListenAndServeTLS

时间:2015-08-24 05:58:27

标签: ssl go https

如何使用多个域监听和服务?我看到该函数接受一个证书和密钥文件,但我相信密钥文件可能只包含一个私钥。我有一些私钥,用于不同的证书链。

2 个答案:

答案 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年),但它也展示了如何实现必要的功能。