我正在使用
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();
谢谢 马亨德拉
由于
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()
),但不支持私钥。