Sbt发布工件PGP签名失败:未知密钥ID问题求助
嘿,我之前用sbt-pgp搭配Sonatype发布工件时也碰到过类似的密钥ID混淆问题,结合你的情况,给你几个关键排查方向和解决方案:
1. 大概率是子密钥未上传导致的问题
你看到的错误ID 5b09423c9d5fbb5d,很可能是你密钥对里的子密钥ID——而你只把主密钥(C500A525A2EFCB99)上传到了密钥服务器。sbt-pgp默认会优先用子密钥签名,但Sonatype需要找到对应签名子密钥的公钥才能通过校验。
你可以用gpg命令查看本地密钥的完整信息:
gpg --list-secret-keys --keyid-format LONG
输出会类似这样:
sec rsa4096/C500A525A2EFCB99 2024-05-20 [SC] uid [ultimate] Mehmet Yucel <mehmet@mehmetyucel.com> ssb rsa4096/5B09423C9D5FBB5D 2024-05-20 [E]
如果ssb行的ID正好是错误里的5b09423c9d5fbb5d,那就是子密钥没上传。解决方法是把这个子密钥推送到密钥服务器:
gpg --keyserver keyserver.ubuntu.com --send-keys 5B09423C9D5FBB5D
等待10-15分钟让密钥服务器同步,再重新执行发布流程。
2. 确认sbt是否真的在使用你指定的密钥
虽然你说改usePgpKeyHex为无效值会报错,但可以再进一步验证:执行sbt pgp-cmd list命令,查看sbt加载的密钥列表,确认C500A525A2EFCB99是活跃的签名密钥。
如果发现sbt默认用的是子密钥,你可以在build.sbt里明确指定使用主密钥签名:
pgpSigningKey := Some(java.security.KeyId.parse("C500A525A2EFCB99"))
(不同sbt-pgp版本可能有差异,可配合usePgpKeyHex使用或直接替换)
3. 排查全局sbt配置的干扰
你在三个系统都遇到同样的问题,有可能是全局sbt配置(比如~/.sbt/0.13/global.sbt或者~/.sbt/0.13/plugins/下的配置)里存在其他密钥相关设置,覆盖了项目配置。可以检查这些文件,确保没有额外的pgpSecretRing、pgpPublicRing或usePgpKeyHex配置。
4. 排除Sonatype缓存或仓库配置问题
如果上面的方法都没用,先检查你的publishTo配置是否正确指向自己的Sonatype staging仓库——误发布到他人仓库也可能出现奇怪的密钥错误。另外,你可以登录Sonatype Nexus UI,查看staging仓库里的工件签名信息,确认实际签名用的密钥ID到底是什么。
内容的提问来源于stack exchange,提问作者kali

