0

我想对 Go crypto/tls 标准库进行一些更改。

在供应商文件夹中制作 crypto/tls 的副本是一种好方法吗?

它几乎可以工作,似乎在我编译应用程序(Caddy 网络服务器)时使用的副本。除了一个错误,我得到:

go/src/github.com/user/caddy/caddytls/httphandler.go:40:不能使用“vendor/crypto/tls”.Config 文字(类型 *“vendor/crypto/tls”.Config)作为类型 *“crypto /tls".Config 中的字段值

有没有一种方法可以解决这个错误?不过,对我来说这听起来不是很好的做法。

我原以为总是会使用出售的副本,但似乎有些东西仍在使用标准的 crypto/tls 库?(我认为“net/http”是。我也必须卖这个吗?)

4

2 回答 2

0

我需要相同的功能。似乎 crypto/tls 包不允许读取从客户端添加到 ClientHello 有效负载中的自定义 TLS 扩展。能够检查任何自定义扩展然后相应地编组它们会很棒。

遗憾的是,这不是一个单独的包,因为我们可以在 go.mod 文件中使用 replace 来指定自定义 TLS 包。

例如

replace golang.org/x/crypto/tls => ./tls

然后运行go mod vendor

./tls 是我应用了更改的本地版本。

于 2021-05-06T10:20:29.793 回答
0

我实际上不得不这样做。最实用的方法是复制和修改包(以及它的内部依赖项)——这包括一些导入路径。而且它并不是真正的vendored(vendoring基本上是使用未修改的包,否则vendoring工具将无法工作),它是一个fork,名称不同。我猜想球童不需要修改后的版本 - 如果需要,您还需要分叉和修改球童。

不言而喻,但在修改 crypto/tls 包时要非常小心——例如,我必须做一个不会真正修改 TLS 操作的最小更改(我需要能够从会话主密钥和随机数中获取密钥材料) .

此外,您必须完全意识到这会带来巨大的成本 - 当新版本的 go 发布时,可能会更新 crypto/tls 包或其依赖项,您将不得不再次手动应用您的更改。提交原始版本和您的版本之间的差异会有所帮助。我认为这对于重要的更改根本不实用(我的更改非常有限 - Config 中的一个新公共字段,握手中的几行代码,一个新界面)。

于 2017-05-18T06:51:43.253 回答