GnuPG (gpg --verify, git verify-commit / verify-tag)Git
错误信息
gpg: BAD signature from "Release Bot <release@example.com>" [ultimate]
也可能输出为
- gpg: BAD signature from "Release Bot <release@example.com>" [unknown]
引号中的用户 ID 和方括号中的信任级别(`[ultimate]`、`[full]`、`[unknown]`)来自你的密钥环。
含义
gpg 有签名者的公钥,也检查了签名,但检查未通过:数据并不是密钥持有者签名的那份数据。与“No public key”不同,这是一个确定的否定结论——文件或对象在签名后被修改过,或者签名属于其他数据。应把内容视为不可信。方括号中的词是你对该密钥的信任级别,不属于验证结论。
原因
数据在签名后被修改过
常见被篡改的下载文件、被编辑过的校验和文件,或者被重写却没有重新签名的提交对象。签名的存在正是为了揭示这种情况。
换行符或编码被转换了
常见Git 的 `autocrlf`、ASCII 模式的 FTP,或者会在末尾添加换行符的编辑器,都会改变文本文件的字节,于是针对原始字节的分离签名就不再匹配。
签名和文件不对应
偶见用一个版本的 `.asc` 去验证另一个版本的文件,或者拿 tar 包的签名去检查校验和文件。
修复方法
- 1.
重新获取两个文件并再次验证
如果通过可信渠道获取文件后结果仍然是 BAD,就不要使用这些内容,并通知发布者。
bash # Fetch both files again over a verified channel and compare sha256sum release.tar.sha256 curl -sSLO https://example.com/downloads/release.tar.sha256 curl -sSLO https://example.com/downloads/release.tar.sha256.asc gpg --verify release.tar.sha256.asc release.tar.sha256 - 2.
防止已签名的文本文件被转换
在 `.gitattributes` 中把签名文件和校验和文件标记为二进制(binary),使换行符转换永远不会处理它们。
text # .gitattributes: never convert line endings of signed files *.asc -text *.sig -text SHA256SUMS -text
相关错误
gpg: Can't check signature: No public keyGnuPG (gpg --verify, git verify-commit / verify-tag / log --show-signature)Signature verification failed: incorrect signatureOpenSSH ssh-keygen -Y verify (SSHSIG)invalid signature when validating ASN.1 encoded signatureSigstore cosign (verify-blob / verify with --key)