jose4j:如何将私钥传递给 JsonWebSignature?

问题描述 投票:0回答:1

我正在使用

org.bitbucket.b_c:jose4j:0.9.6
并且我正在尝试签署 JWT 令牌并使用下面的代码,我无法找到将私钥传递给 JsonWebSignature 对象的方法 -

jws.setKey(PublicJsonWebKey.Factory.newPublicJwk(privateKeyPem).getPrivateKey());

是我尝试设置密钥的行,任何帮助将不胜感激。

String consumerKey = "****************************************";
String certificateId = "sdsdsdssdsdsdsdssdsdsdsfefer";
String tokenEndpoint = "https://xxxxxxxxxxxxxxxxxxxxxx/token";

String privateKeyPem = "-----BEGIN PRIVATE KEY-----\n"
    + "MII.......................
      .........................Q3AFte\n "
    + "+**************************s=\n"
    + "-----END PRIVATE KEY-----";

JwtClaims claims = new JwtClaims();
claims.setIssuer(consumerKey);
claims.setAudience(tokenEndpoint);
claims.setExpirationTimeMinutesInTheFuture(60); // 1 hour
claims.setGeneratedJwtId();
claims.setIssuedAtToNow();
claims.setClaim("scope", "restlets rest_webservices");

// Create JWS Header
JsonWebSignature jws = new JsonWebSignature();
jws.setPayload(claims.toJson());
jws.setAlgorithmHeaderValue("PS256");
jws.setKeyIdHeaderValue(certificateId);
jws.setKey(
    PublicJsonWebKey.Factory.newPublicJwk(privateKeyPem).getPrivateKey());
jws.setDoKeyValidation(false);

// Sign the JWT
String jwt = jws.getCompactSerialization();

谢谢 马亨德拉

java algorithm jwt rsa
1个回答
0
投票

由于

setKey()
可以处理
RSAPrivateCrtKeyImpl
实例(假设 RSA 因为
PS256
),您可以照常使用 JCA/JCE 导入 PEM 密钥:

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
...
String privateKeyPem = "-----BEGIN PRIVATE KEY-----\n"
    + "MII.......................
      .........................Q3AFte\n "
    + "+**************************s=\n"
    + "-----END PRIVATE KEY-----";
byte[] privateKeyDer = Base64.getDecoder().decode(
        privateKeyPem.replace("-----BEGIN PRIVATE KEY-----", "")
        .replace("-----END PRIVATE KEY-----", "")
        .replace("\n", ""));
PKCS8EncodedKeySpec pkcs8 = new PKCS8EncodedKeySpec(privateKeyDer);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privateKey = kf.generatePrivate(pkcs8);
...
jws.setKey(privateKey);

由于

PKCS8EncodedKeySpec
需要DER密钥,因此直接使用DER编码密钥更方便:

byte[] privateKeyDer = Base64.getDecoder().decode("MII...s=");

该库还有辅助类,例如

KeyPairUtil
。但是,我只发现支持 PEM 编码的public 密钥 (
KeyPairUtil#fromPemEncoded()
),但不支持私钥。

© www.soinside.com 2019 - 2024. All rights reserved.