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 里再请求一次接口。。
1
seth19960929 2022-07-14 13:28:34 +08:00
弄个全局变量上锁就可以了, 这有什么问题?
|
2
dzdh OP @seth19960929 是想让他跟着当前请求走,因为有些配置属性每次请求可能不一样
|
3
seth19960929 2022-07-14 16:57:02 +08:00
map 一个域名就可以了
|
4
dzdh OP |
5
blless 2022-07-14 19:45:32 +08:00
server 端的证书跟着客户端请求走。。这种用法也太怪了吧?
TLS 握手交换验证证书在你 HandleFunc("/")之前就完成了,TLS 证书配置则必须在 http server 启动前就配置好。。你们需求是不是搞错了因果关系。。 |
6
jinliming2 2022-07-14 20:13:52 +08:00 via iPhone 1
@blless 并不奇怪啊,根据客户端请求的 SNI 下发不同的证书,或者根据客户端的版本兼容性下发 RSA/ECC 证书,这是个很常见的需求吧?
TLS 证书可以不在 http server 启动前配置,甚至可以等用户来请求了再去用 ACME 协议申请证书,然后缓存。 |