为了账号安全,请及时绑定邮箱和手机立即绑定

具有多个证书的 http.ListenAndServeTLS

具有多个证书的 http.ListenAndServeTLS

Go
万千封印 2021-11-01 16:34:11
如何使用多个域进行 ListenAndServeTLS?我看到该函数接受证书和密钥文件,但我相信密钥文件可能只包含一个私钥。我有一些私钥,用于不同的证书链。
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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("", "")


查看完整回答
反对 回复 2021-11-01
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我自己不是 Go 用户,但是如果您想在同一个 TLS 侦听器上使用多个证书,您必须有某种方法来决定在客户端连接后应使用哪个证书,因为在 TLS 握手中只能发送一个证书 + 链.

其主要用例是服务器名称指示 (SNI)。使用 SNI,您有多个证书,您希望根据客户端在 TLS 握手中要求的名称选择合适的证书。

2013年的这篇文章中搜索go sni 服务器结果。这篇文章表明,在 ListenAndServeTLS 中使用多个证书是不可能的(或者是在 2013 年),但它也展示了如何实现必要的功能。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信