使用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
相关产品推荐
相关产品推荐

