我想对Go crypto / tls标准库进行一些更改。
在vendor文件夹中制作crypto / tls的副本是一个很好的方法吗?
它几乎可以工作,似乎是我编译应用程序时使用的副本(Caddy webserver)。除了一个错误,我得到了:
go / src / github.com / user / caddy / caddytls / httphandler.go:40:不能使用" vendor / crypto / tls" .Config literal(type *" vendor / crypto /tls".Config)类型*" crypto / tls" .Config in field value
有没有一种方法来摆脱这一个错误?虽然对我来说听起来不是好习惯。
我原本以为销售副本总会被使用,但看起来似乎还在使用标准的crypto / tls库? (我想" net / http"是。我也必须提供这个吗?)
答案 0 :(得分:0)
我实际上必须这样做。最实用的方法是复制和修改包(以及它的内部依赖关系) - 这包括一些导入路径。它并没有真正出售(出售基本上是使用未经修改的包,否则销售工具将无法工作),它是一个不同名称的分叉。我猜想球童不需要修改版本 - 如果是的话,你需要分叉和修改球童。
毋庸置疑,但在修改crypto / tls包时要非常小心 - 例如,我必须做一个不会真正修改TLS操作的最小更改(我需要能够从会话主密钥中获取密钥材料)和randoms)。
此外,您必须完全意识到这会产生巨大的成本 - 当新版本的go出来时,可能会对crypto / tls软件包或其依赖项进行更新时,您将不得不再次应用更改,手动。在vanilla版本和您的版本之间提供差异有助于。我不认为这对于非平凡的变化是完全可行的(我的非常有限 - 在Config中有一个新的公共领域,在握手中有几行代码,一个新界面)。
答案 1 :(得分:0)
我需要相同的功能。似乎 crypto/tls 包不允许读取从客户端添加到 ClientHello 负载中的自定义 TLS 扩展。如果能够检查任何自定义扩展,然后相应地将它们编组出来,那就太好了。
遗憾的是,这不是一个单独的包,因为我们可以在 go.mod 文件中使用替换来指定自定义 TLS 包。
例如
replace golang.org/x/crypto/tls => ./tls
然后运行 go mod vendor
。
其中 ./tls 是应用了更改的本地版本。