JWT:带有公钥/私钥的 jwtk/jjwt

Posted

技术标签:

【中文标题】JWT:带有公钥/私钥的 jwtk/jjwt【英文标题】:JWT: jwtk/jjwt with public/private keys 【发布时间】:2016-10-14 00:54:34 【问题描述】:

Auth0 提供了两个 JWT 库,一个用于 Node:node-jsonwebtoken,一个用于 Java:java-jwt。 turns out java-jwt 不支持公钥/私钥对。

但是,另一个 java 库 jjwt 库声称支持该功能。但是,文档没有显示如何在jjwt 中使用自己的公钥/私钥对。

我创建了私钥/公钥对,并在 Node 中成功使用node-jsonwebtoken:

var key = fs.readFileSync('private.key');
var pem = fs.readFileSync('public.pem');

var header = ...;
var payload = ...;

header.algorithm = "RS256";
var message = jsonwebtoken.sign(payload, key, header);
var decoded = jsonwebtoken.verify(message, pem, algorithm: "RS256");

但我发现没有办法在 Java 中使用 jjwt 做同样的事情。

任何人都有一个工作示例,说明如何使用 jjwt 在 Java 中为 JWT 使用私钥/公钥?

【问题讨论】:

FWIW:我建议你使用 jose4j,bitbucket.org/b_c/jose4j/wiki/Home,这是 JOSE/JWT 的领先 Java 实现 【参考方案1】:

这是我关注的

创建密钥库

keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass 密码 -validity 360 -keysize 2048

您可以从现有的私钥和公钥创建密钥库。谷歌一下怎么做。

加载密钥库

    KeyStore ks = KeyStore.getInstance("JKS");
    InputStream readStream = // Use file stream to load from file system or class.getResourceAsStream to load from classpath
    ks.load(readStream, "password".toCharArray());
    Key key = ks.getKey("selfsigned", "password".toCharArray());
    readStream.close();

使用JJwt api对消息进行签名

String s = Jwts.builder().setSubject("Abc").signWith(SignatureAlgorithm.RS512, key).compact();

使用JJwt api获取消息

X509Certificate certificate = (X509Certificate) keyEntry.getCertificate();
Jwts.parser().setSigningKey(certificate.getPublicKey()).parseClaimsJws(s).getBody().getSubject().equals("Abc");

【讨论】:

您能否澄清一下 keyEntry 的来源? PrivateKeyEntry keyEntry = (PrivateKeyEntry) ks.getKey("selfsigned", "password".toCharArray()); 不兼容的类型:密钥无法转换为 PrivateKeyEntry - 我猜 getKey 返回的密钥无法转换为 PrivateKeyEntry... :(

以上是关于JWT:带有公钥/私钥的 jwtk/jjwt的主要内容,如果未能解决你的问题,请参考以下文章

公钥跟私钥的理解

各种格式SSH 公钥和私钥之间的转换

RSA公钥私钥的作用

JWT 私钥/公钥混淆

RSA公钥和私钥的生成以及PKCS#1与PKCE#8格式的转换

初识RSA公钥和私钥