创建一个使用java编码私钥的rsa256 JWT



我正在尝试为行API创建访问令牌下面是我的私钥
{
"alg"RS256",
"d":"TC4Ij……wqSQIQ",
"dp":"nJg12KiRo…nc02GdK-d8",
"dq":"UzRtJ…HA70",
"e":"AQAB",
"ext":真的,
"key_ops": [
"sign">
),
"kty":"RSA",
"n":"rj_fXZ…kuNDvOOHimw",
"p":"70 k5ha_wtnmaem…z4pG79DZ5U",
"qi":"7 j7gzqq…NfS7B8HRiC4"
}

我想创建一个令牌的关键与有效载荷和头使用下面的代码

String token = null;
byte[] privateKey = ResourceUtil.readStr("line_key/privatekey-dev.json", StandardCharsets.UTF_8).getBytes();
// ペイロードの設定
Map<String, Object> payloadClaims = new HashMap<>();
// line channel id
payloadClaims.put("iss", "XXXXXXX");
payloadClaims.put("sub", "XXXXXXX");
payloadClaims.put("aud", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
payloadClaims.put("exp", new Date(System.currentTimeMillis() + 60 * 30));
payloadClaims.put("token_exp", 60 * 60 * 24 * 30);
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(privateKey);
RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privSpec);
//Algorithm algorithm = Algorithm.RSA256(null, privKey);
token = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "RS256")
.setHeaderParam("kid", "XXXXXXX").setClaims(payloadClaims)
.signWith(SignatureAlgorithm.RS256, privKey) 
.compact();
} catch (Exception e) {
log.error(e.getMessage());
}

由于私有的没有编码,所以我没有使用Base64来解码它。
但是总是显示
java.security.spec。InvalidKeySpecException: java.security.InvalidKeyException:无效的密钥格式
即使我使用Base64来解码从json文件读取的私钥,它也不起作用。

byte[] keyContentAsBytes = Base64.getMimeDecoder().decode(privateKey);
谁能告诉我怎样解决这个问题?
谢谢

PS: jwt可以由python用

生成
key = RSAAlgorithm.from_jwk(privateKey)
JWT = jwt.encode(payload, key, algorithm="RS256", headers=headers, json_encoder=None)

首先,因为您正在重新发明日期算术轮,所以您的令牌将仅在1.8秒内有效。我怀疑这不是你的本意。使用java.time中更高层次的api,而不是java.util中神奇的数字和过时的类型,这样你的代码就能清楚地表达意图。

你没有PKCS-#8编码的密钥规格,所以你不能使用PKCS8EncodedKeySpec。出于某种我无法理解的原因,JWK忽略了pkcs# 8等现有标准,并发明了一种带有臃肿但仍然不透明的JSON编码的新格式。

如果您确实需要自己转换私钥,您可以从JWK获取参数并创建RSAPrivateCrtKeySpec。我说"真的"。因为如果你正在使用的库没有办法从JWK表示加载PrivateKey,我会感到惊讶。

这是JWK RSA私钥成员和Java的RSAPrivateCrtKeySpec属性之间的映射。

JWK成员rsprivatecrtkeyspec属性n模量dprivateExponentpprimePqprimeQdpprimeExponentPdqprimeExponentQ气crtCoefficient

最新更新