给 Golang 项目做签名,核心目的并不复杂:让使用者确认二进制文件确实来自你本人,而且在传输或分发过程中没有被改动。下面按 Ubuntu 环境下最常见的做法展开,从生成 GPG 密钥到发布公钥,再到给产物签名与验证,整套流程都可以直接接入日常构建。
为什么要给 Go 项目签名
对外发布 Go 项目时,很多团队会直接提供编译好的二进制文件。签名的作用,是给这些产物附上一份可校验的数字凭据:一方面证明文件的发布者身份,另一方面帮助用户判断文件是否被篡改。
在实际发布中,最常见的是使用 GPG 为二进制文件生成分离式签名,也就是把签名内容单独保存为一个文件,和程序本体一起提供下载。
先生成一组 GPG 密钥对
开始之前,你需要先准备好一组 GPG 密钥。私钥用于签名,公钥用于给别人验证签名。
gpg --full-generate-key
执行后,按照提示选择密钥类型、密钥大小和有效期,再填写姓名、邮箱等身份信息。完成后,你就会得到一组可用于签名的公钥和私钥。
这里要注意两点:
- 私钥只保存在你自己手中,不能随意分发。
- 后续别人要验证你发布的文件,必须能拿到对应的公钥。
导出公钥并随项目一起发布
生成密钥后,下一步就是导出公钥。这样项目使用者才能导入公钥,对签名结果进行校验。

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是对应的签名文件- 发布时两者必须一起提供,否则用户无法独立完成校验
如何验证签名是否有效
签名完成后,建议先在本地验证一次,确认文件和签名能够正确匹配。

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 脚本就能把这几步串起来。

#!/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 项目来说,这既是基本的安全措施,也能显著提升分发过程的可信度。









