Go Module 镜像、索引和 Checksum 服务器上线

未匹配的标注

本文为官方 Go Blog 的中文翻译,详见 翻译说明

Katie Hockman
29 August 2019

我很高兴分享我们的模块 镜像index,和 checksum database 已经可以使用了! 默认情况下, go 命令将使用模块镜像和校验数据库用于 Go 1.13 module users。有关这些服务的隐私权信息 proxy.golang.org/privacy 和  go命令文档 请参阅相关链接以获得配置详细信息,包括如何禁用这些服务器或使用其他服务器。包括如何禁用这些服务器或使用其他服务器。如果您依赖于非公共模块,请参阅 用于配置环境的文档

这篇文章将描述这些服务以及使用它们的好处,并总结Gophercon 2019上Go Module Proxy: Life of a Query 演讲的一些要点。请参阅 recording如果您对完整的演讲感兴趣。

模块镜像

Modules 是一起版本化的Go软件包集,每个版本的内容都是不可变的。这种不变性为缓存和身份验证提供了新的机会。当go get在模块模式下运行时,它必须获取包含请求的程序包的模块以及该模块引入的任何新依赖项,从而更新您的 go.mod 和 go.sum 文件。从版本控制中获取模块对于系统中的延迟和存储而言可能是昂贵的:go命令可能被强制拉下包含传递依赖项的存储库的完整提交历史记录,即使不是只是为了解决其版本而已。

解决方案是使用模块代理,该模块代理的API更适合go命令的需求(请参阅go help goproxy)。当go get使用代理在模块模式下运行时,通过仅询问其所需的特定模块元数据或源代码,而不担心其余部分,它将更快地工作。下面是一个示例,说明go命令如何通过请求版本列表,然后请求最新标记版本的信息,mod和zip文件,将代理与go get一起使用。

模块镜像是一种特殊的模块代理,可以在其自己的存储系统中缓存元数据和源代码,从而允许该镜像继续提供原始位置不再可用的源代码。这样可以加快下载速度,并保护您免受依赖关系的消失。有关更多信息,请参见 Go Modules in 2019

Go团队维护一个模块镜像,该镜像位于 proxy.golang.org处,go命令将默认使用此镜像给模块用户1.13。如果您正在运行go命令的早期版本,则可以通过在本地环境中设置GOPROXY = https:///proxy.golang.org来使用此服务。

校验和数据库

模块引入了go.sum文件,该文件是源代码的SHA-256哈希列表以及每个依赖项在首次下载时的go.mod文件的列表。 go命令可以使用散列来检测源服务器或代理的不当行为,该源服务器或代理为您提供相同版本的不同代码。

go.sum文件的局限性在于,它在您首次使用时完全通过信任起作用。当您向模块添加以前从未见过的依赖性版本时(可能是通过升级现有依赖性),go命令将获取代码并将行添加到go.sum中随时随地文件。问题在于这些go.sum行未与其他任何行进行检查:它们可能与go命令的go.sum行不同只是为别人生成的,也许是因为代理人故意提供了针对您的恶意代码。

Go的解决方案是go.sum行的全球来源,称为 checksum database,以确保go命令始终将相同的行添加到每个人的go.sum文件中。每当go命令接收到新的源代码时,它可以针对此全局数据库验证该代码的哈希值,以确保哈希值匹配,从而确保每个人对于给定版本都使用相同的代码。

校验和数据库由 sum.golang.org提供服务,并基于 Transparent Log (或由 “Merkle tree”)  Trillian支持的哈希的“ Merkle树”。 Merkle树的主要优点在于,它是防篡改的,并且具有不会导致不当行为被发现的属性,因此比简单的数据库更值得信赖。 go命令使用此树在添加新的之前检查“包含”证明(日志中存在特定记录)和“一致性”证明(该树未被篡改)。 go.sum行指向模块的go.sum文件。以下是此类树的示例。

校验和数据库支持go命令使用的 a set of endpoints 请求并验证go.sum行。 / lookup端点提供一个“签名树头”(STH)和请求的go.sum行。 / tile端点提供了称为 tiles 的树的块,go命令可用于证明。以下是go命令如何通过执行模块版本的/ lookup然后请求证明所需的图块与校验和数据库交互的示例。

此校验和数据库允许go命令安全地使用其他不受信任的代理。由于位于其之上的是可审核的安全层,因此代理服务器或原始服务器无法有意,任意或意外地为您提供错误的代码而不会被抓住。即使是模块的作者,也无法在不检测到更改的情况下,四处移动标签或以其他方式将与特定版本相关的位从一天更改为另一天。

如果您使用的是 Go 1.12 或更早版本, 则可以使用 gosumcheck 根据校验和数据库手动检查 go.sum 文件。

$ go get golang.org/x/mod/gosumcheck
$ gosumcheck /path/to/go.sum

除了 go 命令所做的验证之外,第三方审计人员还可以通过遍历日志来查找错误的条目,从而使校验和数据库负责。他们可以一起工作,并在树生长的过程中讨论树的状态,以确保它不会受到损害,我们希望 Go 社区能够运行它们。

模块索引

模块索引由 index.golang.org 提供,它是通过 proxy.golang.org 提供的新模块版本的公共提要。这对于那些想要保留 proxy.golang.org 中可用内容的缓存,或者想要了解人们正在使用的一些最新模块的工具开发人员特别有用。

返回或错误

我们希望这些服务能够改善您的模块体验,并鼓励您在遇到问题或有反馈时提交问题

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:4
讨论数量: 0
发起讨论 只看当前版本


暂无话题~