You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配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使用传统格式:

  1. 编辑~/.gnupg/gpg.conf,添加以下配置:
    keyring pubring.gpg
    secret-keyring secring.gpg
    
  2. 重新生成密钥:
    gpg --full-gen-key
    # 选择1(RSA and RSA)、4096位密钥、永不过期,输入名称/邮箱/密码
    
  3. 导出秘钥环:
    gpg --export-secret-keys <你的公钥ID> > secring.gpg
    
  4. 后续Gradle配置同方案1的方式A或B。

内容的提问来源于stack exchange,提问作者Qazi Fahim Farhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:32:36