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

使用ECDSA私钥生成JWT Token时遭遇版本不匹配异常

解决ECDSA私钥生成JWT时的version mismatch错误

问题根源

你的EC私钥是SEC1格式(标识为-----BEGIN EC PRIVATE KEY-----),但代码里用PKCS8EncodedKeySpec解析密钥——这个类仅支持PKCS#8格式私钥(标识为-----BEGIN PRIVATE KEY-----),格式不匹配直接触发了版本兼容异常。

解决方案

提供两种可行修复方式,任选其一即可:

方式一:转换私钥格式为PKCS#8

用OpenSSL命令将SEC1格式私钥转成PKCS#8格式:

openssl pkcs8 -topk8 -nocrypt -in 原私钥文件.pem -out 转换后pkcs8私钥文件.pem

转换完成后,替换代码中EC_PRIVATE_KEY_STR为转换后的PKCS#8格式私钥内容即可。

方式二:修改代码直接解析SEC1格式私钥

借助BouncyCastle库直接解析SEC1格式私钥,替换原代码的密钥解析逻辑:

Security.addProvider(new BouncyCastleProvider());
String EC_PRIVATE_KEY_STR = "-----BEGIN EC PRIVATE KEY-----"
        + "MHQCAQEEIBuSmY4MFZ938j0sno1nOICb0ScfIebC1O7DXkvf6UDMoAcGBSuBBAAK"
        + "oUQDQgAELAWORZuUv+lpO34bVoYHv6T3Gey+GtuHFB+TH1+l0tRKfKELHcmHlDOK"
        + "ebiIegDVhHd6jYx2yT1nOBddjDHCVw=="
        + "-----END EC PRIVATE KEY-----";

// 用BouncyCastle的PEMParser解析SEC1格式私钥
try (PEMParser pemParser = new PEMParser(new StringReader(EC_PRIVATE_KEY_STR))) {
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
    ECPrivateKey EC_PRIVATE_KEY = (ECPrivateKey) converter.getPrivateKey((PEMKeyPair) pemParser.readObject());

    // 后续JWT生成逻辑不变
    var currentDateTime = new Date(System.currentTimeMillis());
    final String jwt = Jwts.builder()
            .setHeaderParam("kid", "any")
            .signWith(SignatureAlgorithm.ES256, EC_PRIVATE_KEY)
            .compact();
    return jwt;
} catch (IOException e) {
    throw new RuntimeException("解析私钥失败", e);
}

需确保项目引入BouncyCastle依赖(以Maven为例):

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.77</version> <!-- 可用最新稳定版本 -->
</dependency>

内容的提问来源于stack exchange,提问作者divyanayan awasthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:40:26