首页/开发/CI/CD 与发布速查/GPG 签名发布物
构建与制品管理58 条

GPG 签名发布物

为发布包与标签提供加密签名:校验来源与完整性(非加密机密),密钥应离线保存并配合轮换策略。

CI/CD 与发布速查开发更新于 2026-10-13

GPG 签名发布物是什么

用 GPG 为发布包与 Git 标签提供来源与完整性证明:私钥签名,任何人拿到公钥都能验证「是谁发布的、内容有没有被改」。注意签名解决的是来源与完整性,不是加密机密——内容依然明文可读。Maven Central 等公共仓库强制要求对发布包签名,属于供应链安全的最低限度配套。

基本信息

场景Maven Central 强制 GPG 签名;RPM/DEB 仓库元数据签名;git tag -s
形态分离签名 .asc 或内嵌签名
验证gpg --verify 对照发布方的公钥指纹
密钥实践子密钥用于签名,主密钥离线保存
公布指纹写进发布说明,通过独立渠道公布

典型使用场景

  • 公共仓库发布:Maven Central 等强制签名才收件
  • 发行版仓库:RPM/DEB 元数据签名让包管理器可验证
  • Git 标签签名:证明标签确实由维护者打出
  • 制品分发:为下载包提供 .asc 分离签名
  • 密钥轮换:新旧公钥并存过渡,历史版本仍可验证
  • 密钥托管:用硬件令牌或受控签名服务承载私钥,减少明文暴露面

签名与验证

签名与验证
gpg --detach-sign -a app-1.9.0.tar.gz              # 生成分离签名 .asc
gpg --verify app-1.9.0.tar.gz.asc app-1.9.0.tar.gz # 本地验证
gpg --fingerprint <keyid>                          # 核对指纹(与发布说明比对)
git tag -s v1.9.0 -m "release 1.9.0"               # 给标签签名
git verify-tag v1.9.0                              # 验证标签签名

验证结果读法

输出含义处理
Good signature签名有效再核对指纹是否与发布方一致
BAD signature内容被改动停止使用该制品并上报
Can't check signature缺公钥导入发布方公钥后重试
签名密钥等同于发布身份:使用子密钥签名、主密钥离线,公开指纹与轮换说明;日常签名用子密钥,主密钥只在轮换时出动。
签名不等于加密:只验证来源与完整性,任何人拿到文件仍可读取内容;对外文档同时给出公钥获取方式与验证命令。

易错点

  • 私钥放在 CI 明文变量:一旦泄露可伪造任意发布,使用受保护环境+最小暴露
  • 公钥分发渠道与制品同源:被同时篡改则失效,通过独立渠道公布指纹
  • 密钥过期不处理:验证方一律报过期,提前规划轮换并保留旧公钥验证历史版本,过期也别急着删旧公钥
  • 只签制品不签校验清单:批量分发场景下 sums 文件也要纳入签名范围
  • 验证只看 Good signature 不核对指纹:密钥可信性才是关键,指纹必须比对

数据来源与参考

  • GnuPG 文档
  • Maven Central 发布要求(Sonatype)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌