net/http go 包有一个类型 request,它定义了一个包含
ConnectionState
的 TLS 字段。不过,描述中的最后一条语句表示 HTTP 客户端会忽略它。我在调试时也检查过,它是nil
。
我需要从该
连接状态(或其他地方)获取值
TLSUnique
,以便我可以将其包含在我的证书请求(也称为 CSR)中,然后才能注册/将其发送到服务器。
然后,服务器收到请求,并检查 CSR 的签名以及 TLS 唯一值,证明建立 TLS 连接的客户端与签署 CSR 的客户端是同一客户端。
这是来自 RFC 7030 - 第 3.5 节(EST 协议)
我正在使用 GlobalSign EST Go 软件包,它们似乎不包含此功能。
实例化您的
http.Server
,然后将其字段 ConnContext
设置为某个函数。
该函数接收正在服务客户端请求的
net.Conn
,
所以你可以输入断言它为 tls.Conn
,然后调用 ConnectionState
并检查结果中的 TLSUnique
。
在同一个回调中,您可能希望“包装”与请求关联的原始
context.Context
,并传递给回调,并从该 TLSUnique
中提取一些值,以便您可以在 HTTP 处理程序中检查它是为了满足请求。
类似这样的东西(未经测试):
srv := &http.Server{
// other fields, if needed
ConnContext: func(ctx context.Context, c net.Conn) context.Context {
tc := c.(*tls.Conn)
return context.WithValue(ctx, mypkg.MyKey,
tc.ConnectionState().TLSUnique)
},
}
// ...
func MyHTTPReqHandler(rw http.ResponseWriter, req *http.Request) {
uniq := req.Context().Value(mypkg.MyKey)
// verify it's not nil and use
}
上的 文档,了解如何声明 mypkg.MyKey
。
您可能还需要在提取时实际复制
TLSUique
的值 - 我不知道是否需要这样做。