适配Gradle7.3:生成0x14标签GPG密钥或修复密钥读取异常
解决Gradle 7.3发布时PGP密钥"secret key ring doesn't start with secret key tag: tag 0x14"错误
错误原因
Gradle 7.3的signing插件依赖的旧版BouncyCastle库仅支持传统PGP秘钥环格式(以tag 0x14开头),而GPG 2.1+默认生成的是新的Keybox格式,两者不兼容导致读取密钥失败。Gradle 7.6+新增的useGpgCmd()通过调用系统GPG命令规避了这个问题,但7.3不支持该方法。
解决方案
方案1:导出兼容旧格式的秘钥环(推荐,无需重新生成密钥)
现有密钥无需重新生成,只需导出为传统OpenPGP秘钥环格式:
# 导出传统格式的秘钥环文件 gpg --export-secret-keys --format=openpgp <你的公钥ID> > secring.gpg
对应Gradle配置调整
方式A:使用文件秘钥环(稳定可靠)
移除useInMemoryPgpKeys,改用文件配置:
// publish-module.gradle ext["signing.keyId"] = rootProject.ext["signing.keyId"] ext["signing.password"] = rootProject.ext["signing.password"] ext["signing.secretKeyRingFile"] = rootProject.ext["signing.secretKeyRingFile"] signing { sign publishing.publications // 配置密钥信息 usePgpKeyId(ext["signing.keyId"]) password = ext["signing.password"] secretKeyRingFile = file(ext["signing.secretKeyRingFile"]) }
确保signing.secretKeyRingFile指向刚才导出的secring.gpg文件路径。
方式B:使用内存密钥(适合CI/CD场景)
先将导出的秘钥编码为Base64:
gpg --export-secret-keys --format=openpgp <你的公钥ID> | base64 -w0 > secret_key_base64.txt
然后在Gradle中读取编码后的内容:
// publish-module.gradle signing { def secretKey = new String(file("secret_key_base64.txt").bytes, StandardCharsets.UTF_8) useInMemoryPgpKeys( rootProject.ext["signing.keyId"], rootProject.ext["signing.password"], secretKey ) sign publishing.publications }
方案2:生成兼容旧格式的新密钥(不推荐,安全性较低)
如果需要重新生成密钥,可强制GPG使用传统格式:
- 编辑
~/.gnupg/gpg.conf,添加以下配置:keyring pubring.gpg secret-keyring secring.gpg - 重新生成密钥:
gpg --full-gen-key # 选择1(RSA and RSA)、4096位密钥、永不过期,输入名称/邮箱/密码 - 导出秘钥环:
gpg --export-secret-keys <你的公钥ID> > secring.gpg - 后续Gradle配置同方案1的方式A或B。
内容的提问来源于stack exchange,提问作者Qazi Fahim Farhan
相关产品推荐
相关产品推荐

