tls.GetCertificate 方法中怎么设置上下文自定义变量或分享某些值

2022-07-14 11:24:39 +08:00
 dzdh
http.HandleFunc("/", func (...) {
    // 2. 此处读取自定义的变量、值
} )
tlsCfg := tls.Config{
        GetCertificate: func(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
            // 超级多域名
            crt := getCertificateByApi(info.ServerName)
            if crt == nil { return nil, errors.New(".....") }

            // 这里怎么设置一个上下文的自定义变量呢
            // 比如 getCertificateByApi 方法同时返回了其他关于这个域名在系统内的信息,比如系统到期时间等,然后  info.Context().Set("expire", "....")
            
            // 但是 info.Context 只能读取又不能动态替换 Context..


            return crt
        },
}
srv := http.Server{TLSConfig : &tlsCfg}
srv.ListenAndServeTLS("","")

原因是,就趁着这一次接口请求,把该拿的数据都拿了。不想在 handle 里再请求一次接口。。

1086 次点击
所在节点    Go 编程语言
6 条回复
seth19960929
2022-07-14 13:28:34 +08:00
弄个全局变量上锁就可以了, 这有什么问题?
dzdh
2022-07-14 13:42:11 +08:00
@seth19960929 是想让他跟着当前请求走,因为有些配置属性每次请求可能不一样
seth19960929
2022-07-14 16:57:02 +08:00
map 一个域名就可以了
dzdh
2022-07-14 17:10:35 +08:00
@seth19960929 另外一个系统在维护。随时会有变化。

。。看来只能重新实现一遍握手了...
blless
2022-07-14 19:45:32 +08:00
server 端的证书跟着客户端请求走。。这种用法也太怪了吧?

TLS 握手交换验证证书在你 HandleFunc("/")之前就完成了,TLS 证书配置则必须在 http server 启动前就配置好。。你们需求是不是搞错了因果关系。。
jinliming2
2022-07-14 20:13:52 +08:00
@blless 并不奇怪啊,根据客户端请求的 SNI 下发不同的证书,或者根据客户端的版本兼容性下发 RSA/ECC 证书,这是个很常见的需求吧?
TLS 证书可以不在 http server 启动前配置,甚至可以等用户来请求了再去用 ACME 协议申请证书,然后缓存。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX