3. GPG 签名工具:密钥对生成、密钥管理与签名验证实战

GPG(GNU Privacy Guard)是平台工程制品签名链路中的核心工具,负责为制品(容器镜像、Helm Chart、二进制文件)生成不可伪造的数字签名。本节将围绕 GPG 密钥对的全生命周期管理展开,涵盖密钥生成、公钥分发、私钥保护以及签名与验证的完整命令实战。

3.1 GPG 密钥对生成与参数选择

GPG 密钥对由私钥(用于签名)和公钥(用于验证签名)组成。生成密钥对时,需根据安全策略选择合适的算法和密钥长度。

参数 推荐值 说明
算法 RSA 或 Ed25519 RSA 兼容性广;Ed25519 性能更优、密钥更短
密钥长度 4096 位(RSA) 满足长期安全需求,避免 2048 位被破解风险
有效期 2 年 定期轮换降低密钥泄露影响
用途 Sign only 签名专用密钥,不用于加密,减少攻击面
实战命令:生成 RSA 4096 位签名密钥对
# 交互式生成(推荐首次使用)
gpg --full-generate-key

# 非交互式生成(适用于自动化流水线)
cat > gpg_batch.conf <<EOF
%echo Generating a signing key
Key-Type: RSA
Key-Length: 4096
Key-Usage: sign
Name-Real: Platform Engineering Signer
Name-Email: signer@platform.io
Expire-Date: 2y
%commit
%echo Done
EOF

gpg --batch --generate-key gpg_batch.conf
密钥生成提示:生成过程中系统会要求设置私钥保护口令(Passphrase)。在 CI/CD 环境中,建议使用硬件安全模块(HSM)或密钥管理服务(KMS)托管私钥,避免口令明文存储。

3.2 密钥管理:公钥导出与私钥备份

密钥生成后,需立即执行以下管理操作:导出公钥用于分发验证方,备份私钥用于灾难恢复。

3.2.1 公钥导出与分发

# 列出本地密钥,获取 Key ID
gpg --list-secret-keys --keyid-format LONG

# 导出 ASCII 格式公钥(用于上传到公钥服务器或分发给验证方)
gpg --armor --export signer@platform.io > public-key.asc

# 导出二进制格式公钥(用于程序化加载)
gpg --export signer@platform.io > public-key.gpg

3.2.2 私钥导出与安全备份

# 导出私钥(含保护口令,导出时需再次输入口令)
gpg --armor --export-secret-keys signer@platform.io > private-key.asc

# 导出私钥子密钥(仅签名子密钥,推荐用于 CI/CD)
gpg --armor --export-secret-subkeys signer@platform.io > signing-subkey.asc
私钥安全警告:私钥文件必须存储在离线加密介质或专用密钥管理系统中。切勿将私钥文件提交到 Git 仓库、放置在制品目录或通过不安全的网络传输。建议使用 gpg --export-secret-subkeys 仅导出签名子密钥,主密钥保持离线。

3.3 GPG 签名与验证命令实战

制品签名链路的核心操作分为两步:签名方使用私钥对制品摘要进行签名,验证方使用公钥验证签名的完整性和来源。

3.3.1 对制品文件进行签名

# 生成制品摘要并签名(输出 .sig 签名文件)
gpg --detach-sign --armor \
    --default-key signer@platform.io \
    --output artifact.tar.gz.sig \
    artifact.tar.gz

# 生成内嵌签名(签名与文件合并,适用于小文件)
gpg --sign --armor \
    --default-key signer@platform.io \
    --output artifact.tar.gz.asc \
    artifact.tar.gz

3.3.2 验证制品签名

# 验证分离签名(推荐用于 CI/CD 流水线)
gpg --verify artifact.tar.gz.sig artifact.tar.gz

# 验证内嵌签名
gpg --verify artifact.tar.gz.asc

# 导入验证方公钥后验证(首次验证需先导入)
gpg --import public-key.asc
gpg --verify artifact.tar.gz.sig artifact.tar.gz
验证输出解读:成功验证会输出 Good signature from "Platform Engineering Signer <signer@platform.io>"。若输出 BAD signature,表示制品已被篡改或签名不匹配,应立即阻断部署流水线。

3.4 GPG 签名链路架构图

下图展示了从密钥生成到制品验证的完整签名链路,突出私钥保护与公钥分发的安全边界。

GPG 签名链路架构图 GPG 签名链路架构图 密钥生成 gpg --full-generate-key 私钥存储 HSM / KMS / 离线介质 公钥分发 公钥服务器 / 制品仓库 制品签名 gpg --detach-sign 制品存储 OCI Registry / 对象存储 签名验证 gpg --verify 安全边界说明 • 私钥永不离开安全存储 • 公钥可公开分发 • 签名验证在流水线中自动执行

3.5 密钥生命周期管理最佳实践

在平台工程中,GPG 密钥管理需纳入自动化轮换和审计体系。以下表格总结了各阶段的关键操作与安全要求。

阶段 操作 安全要求
生成 使用 RSA 4096 或 Ed25519,设置 2 年有效期 在离线安全环境中执行,记录密钥指纹
分发 导出 ASCII 公钥,上传至公钥服务器或制品仓库 公钥通过 HTTPS 或签名邮件分发,防止中间人替换
签名 使用子密钥签名,主密钥离线 CI/CD 环境仅持有签名子密钥,主密钥由安全团队保管
验证 导入公钥后执行 gpg --verify 验证前检查公钥指纹是否与预期一致
轮换 有效期到期前 30 天生成新密钥对 旧公钥保留在信任库中,用于验证历史制品
撤销 生成撤销证书并分发 私钥泄露后立即撤销,通知所有依赖方

3.6 常见验证失败场景与排查

在 CI/CD 流水线中,签名验证失败是最常见的阻断原因。以下列出典型场景及对应排查命令。

  • 公钥未导入:执行 gpg --list-keys 确认公钥是否存在,若缺失则执行 gpg --import public-key.asc。
  • 签名文件不匹配:检查签名文件是否与制品文件对应,使用 sha256sum 对比制品摘要。
  • 密钥过期:执行 gpg --list-keys --keyid-format LONG 查看有效期,过期密钥需重新签名。
  • 信任级别不足:验证时出现 WARNING: This key is not certified with a trusted signature!,可通过 gpg --edit-key 设置信任级别。
自动化验证脚本片段:在 CI/CD 流水线中,建议将验证逻辑封装为脚本,确保每次部署前自动执行签名校验。
#!/bin/bash
# verify-signature.sh
PUBLIC_KEY_URL="https://keyserver.platform.io/public-key.asc"
ARTIFACT="artifact.tar.gz"
SIGNATURE="artifact.tar.gz.sig"

# 导入公钥
gpg --import <(curl -sL "$PUBLIC_KEY_URL") 2>/dev/null

# 验证签名
if gpg --verify "$SIGNATURE" "$ARTIFACT" 2>/dev/null; then
    echo "✅ 签名验证通过,制品可信"
    exit 0
else
    echo "❌ 签名验证失败,制品可能被篡改"
    exit 1
fi

3.7 密钥对生成与验证流程示意图

下图聚焦密钥对生成到首次验证的完整操作流程,帮助理解每一步的输入输出关系。

GPG 密钥对生成与验证流程 GPG 密钥对生成与验证流程 生成密钥对 gpg --generate-key 导出公钥 gpg --export --armor 签名制品 gpg --detach-sign 分发制品+签名 推送至仓库 导入公钥 gpg --import 验证签名 gpg --verify 验证通过 部署制品 签名方操作 1. 生成密钥对 2. 导出公钥 3. 签名制品 验证方操作 4. 导入公钥 5. 验证签名

3.8 本章小结

GPG 签名工具是平台工程 IDP 制品签名链路的基础设施。通过本章学习,应掌握以下核心能力:

  • 使用 gpg --full-generate-key 或批处理模式生成 RSA 4096 位签名密钥对。
  • 区分公钥导出(--export)与私钥导出(--export-secret-keys)的安全边界。
  • 执行 gpg --detach-sign 对制品进行分离签名,并使用 gpg --verify 完成验证。
  • 将密钥生命周期管理(生成、分发、轮换、撤销)纳入平台工程的自动化流程。