如何在 Ubuntu 上为 Golang 项目添加签名

周叙
周叙
发布时间:2026-08-22 | 13人浏览过
原创

前言

给 Go 项目发布二进制文件时,只靠“这是我编译的”并不足以建立信任,签名才是让使用者自行验证来源和完整性的标准做法。本文按 Ubuntu 环境下的实际流程展开,依次说明 GPG 密钥生成、公钥导出、二进制签名、签名验证以及脚本自动化,读者可以据此判断一套发布物是否具备可验证性。

给 Golang 项目做签名,核心目的并不复杂:让使用者确认二进制文件确实来自你本人,而且在传输或分发过程中没有被改动。下面按 Ubuntu 环境下最常见的做法展开,从生成 GPG 密钥到发布公钥,再到给产物签名与验证,整套流程都可以直接接入日常构建。

为什么要给 Go 项目签名

对外发布 Go 项目时,很多团队会直接提供编译好的二进制文件。签名的作用,是给这些产物附上一份可校验的数字凭据:一方面证明文件的发布者身份,另一方面帮助用户判断文件是否被篡改。

在实际发布中,最常见的是使用 GPG 为二进制文件生成分离式签名,也就是把签名内容单独保存为一个文件,和程序本体一起提供下载。

先生成一组 GPG 密钥对

开始之前,你需要先准备好一组 GPG 密钥。私钥用于签名,公钥用于给别人验证签名。

gpg --full-generate-key

执行后,按照提示选择密钥类型、密钥大小和有效期,再填写姓名、邮箱等身份信息。完成后,你就会得到一组可用于签名的公钥和私钥。

这里要注意两点:

  • 私钥只保存在你自己手中,不能随意分发。
  • 后续别人要验证你发布的文件,必须能拿到对应的公钥。

导出公钥并随项目一起发布

生成密钥后,下一步就是导出公钥。这样项目使用者才能导入公钥,对签名结果进行校验。

GPG 密钥生成与公钥发布关系图
GPG 密钥与发布材料关系图用一张关系图说明私钥、公钥、签名验证三者各自的职责,以及为什么公钥必须随项目公开提供。
gpg --export --armor your-email@example.com > public_key.asc

把命令中的 your-email@example.com 替换成你生成密钥时使用的邮箱即可。执行完成后,会得到一个 public_key.asc 文件。

这个文件建议直接放进项目仓库,例如:

  • 上传到项目根目录,文件名保留为 public_key.asc
  • 或者把公钥内容附到 README 中,方便使用者直接获取

只发布签名文件而不提供公钥,验证链条其实是不完整的,因此这一步不能省。

为编译好的 Go 二进制文件生成签名

假设你的 Golang 项目已经编译完成,产物文件名为 myproject,可以直接使用 GPG 生成分离式签名:

gpg --output myproject.asc --detach-sig myproject

执行后会生成一个 myproject.asc 文件。它不是可执行文件本身,而是与 myproject 对应的签名数据。

这里的关键点是:

  • myproject 是要分发的二进制文件
  • myproject.asc 是对应的签名文件
  • 发布时两者必须一起提供,否则用户无法独立完成校验

如何验证签名是否有效

签名完成后,建议先在本地验证一次,确认文件和签名能够正确匹配。

Go 二进制签名与验证结果图
签名文件与验证结果示意把签名文件、二进制文件和验证输出放在同一张图里,方便读者理解发布物之间的对应关系。
gpg --verify myproject.asc myproject

如果签名有效,通常会看到类似下面的输出:

gpg: Signature made Thu 01 Jan 2020 12:34:56 PM UTC using RSA key ID ABCDEF1234567890
gpg: Good signature from "Your Name <your-email@example.com>"
Primary key fingerprint: ABCDEF12 34567890 12345678 90ABCDEF 12345678

判断结果时,可以重点看这几项:

  • 出现 Good signature,说明签名校验通过
  • 签名者姓名和邮箱应与你的密钥信息一致
  • 指纹信息可用于进一步确认使用的是哪一把密钥

如果看到 Can't check signature 之类的提示,常见原因通常有两个:要么验证方还没有导入你的公钥,要么签名文件本身已经损坏或与原始二进制文件不匹配。

把签名流程写进脚本

如果项目需要频繁构建和发布,手动执行编译、签名、验证会比较琐碎。一个简单的 Bash 脚本就能把这几步串起来。

Ubuntu 下 Go 项目自动化签名脚本流程图
自动化签名脚本执行流程用脚本流程图展示从 go build 到生成签名、再到本地验证的串联步骤。
#!/bin/bash
# 编译项目
go build -o myproject
# 签名项目
gpg --output myproject.asc --detach-sig myproject
# 验证签名
gpg --verify myproject.asc myproject

把脚本保存为 sign_project.sh 后,再赋予执行权限:

chmod +x sign_project.sh

之后直接运行这个脚本,就可以一次完成编译、签名和验证。对于个人项目,这已经足够实用;如果后续接入 CI/CD,也可以在这个基础上继续扩展。

发布时至少确认这几件事

在把产物提交到 GitHub Release、下载页或内部制品库之前,建议再检查一遍:

  • 二进制文件是否是最终发布版本,例如 myproject
  • 签名文件 myproject.asc 是否与该版本一一对应
  • 公钥文件 public_key.asc 是否已公开提供
  • README 或发布说明里是否写清楚验证方式

做到这一步,用户拿到文件后就能自行验证来源和完整性。对于公开发布的 Go 项目来说,这既是基本的安全措施,也能显著提升分发过程的可信度。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表