1. 分离签名(Detached Signature)—— 最常用
签名单独存为一个文件,原文件保持不变。推荐用于软件发布、分发脚本等场景。
生成签名:
gpg --detach-sign --armor 文件名
--detach-sign:生成分离签名--armor:输出 ASCII 文本格式(.asc),否则为二进制格式(.sig)
执行后生成:文件名.asc(例如 myfile.txt.asc)
验证签名:
gpg --verify 文件名.asc 文件名
正确输出应包含:Good signature from "..."
优点:原文件无需改动;接收方可直接使用原文件 + 签名单独验证。
注意:必须同时提供原文件和签名文件才能验证。
2. 清签名(Clear Signature)—— 人类可读
将原文和签名混合在一个文本文件中,原文部分保持明文可读。适合声明、邮件、配置文件。
生成签名:
gpg --clear-sign 文件名
输出文件:文件名.asc,内容形如:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
原文内容,不加密。
-----BEGIN PGP SIGNATURE-----
...
-----END PGP SIGNATURE-----
验证签名:
gpg --verify 文件名.asc
会自动提取原文内容并验证。
优点:可直接用文本编辑器打开看到原文;无需额外携带签名文件。
限制:仅适用于文本文件,二进制文件会乱码。
3. 普通签名(附签)—— 不推荐单独用
将签名与原文打包成一个二进制或文本文件,但无法直接阅读原文。较少用于“单文件签名”。
gpg --sign 文件名 # 生成二进制 .gpg 文件
gpg --sign --armor 文件名 # 生成文本 .asc 文件
验证并恢复原文:
gpg --output 原文件名 --decrypt 签名文件.gpg
缺点:需要解密步骤才能得到原文;不适合原文件已公开的场景。
实操示例(分离签名 + 验证)
# 创建一个测试文件
echo "我的身份声明" > statement.txt
# 生成分离签名(ASCII 格式)
gpg --detach-sign --armor statement.txt
# 得到 statement.txt.asc
# 模拟发送:将 statement.txt 和 statement.txt.asc 发给对方
# 对方验证
gpg --verify statement.txt.asc statement.txt
如果签名有效,你会看到:
gpg: Good signature from "Your Name <you@example.com>"
常见问题
-
验证时报 “Can’t check signature: No public key”
对方没有你的公钥。需要先导出并发送公钥:
gpg --armor --export 你的KeyID > mypubkey.asc -
验证时提示 “WARNING: This key is not certified with a trusted signature!”
这仅表示对方尚未对你的公钥进行信任标记,不影响签名有效性本身(只要显示 Good signature)。 -
我想对一个二进制文件(如图片、压缩包)签名
用分离签名模式(第一种)最合适,无需关心文件格式。
根据你的具体用途选择:
- 给别人发文件 + 验证出处 ➔ 分离签名
- 发可读声明/配置 ➔ 清签名
- 需要加密 + 签名(保密且防伪)➔ 用
--encrypt --sign(不在本问题范围内)
如果需要更具体的自动化脚本或集成到 CI/CD,可以补充说明。