从客户端获取TLS信息

问题描述 投票:0回答:1

net/http go 包有一个类型 request,它定义了一个包含

ConnectionState
的 TLS 字段。不过,描述中的最后一条语句表示 HTTP 客户端会忽略它。我在调试时也检查过,它是
nil

我需要从该

连接状态
(或其他地方)获取值TLSUnique,以便我可以将其包含在我的证书请求(也称为 CSR)中,然后才能注册/将其发送到服务器。

然后,服务器收到请求,并检查 CSR 的签名以及 TLS 唯一值,证明建立 TLS 连接的客户端与签署 CSR 的客户端是同一客户端。

这是来自 RFC 7030 - 第 3.5 节(EST 协议)
我正在使用 GlobalSign EST Go 软件包,它们似乎不包含此功能。

go tls1.2 handshake csr
1个回答
0
投票

实例化您的

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
}

查看 context.Context.Value

 上的 文档,了解如何声明 
mypkg.MyKey

您可能还需要在提取时实际复制

TLSUique
的值 - 我不知道是否需要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.