2016-06-13 193 views
4

Auth0提供了两个JWT库,一个用于节点:node-jsonwebtoken,另一个用于Java:java-jwt。它turns outjava-jwt不支持公/私钥对。JWT:带公钥/私钥的jwtk/jjwt

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

我创建的私有/公共密钥对,并与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"}); 

但我没有发现任何与jjwt做在Java中相同的方式。

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

+0

FWIW:我建议你使用jose4j ,https://bitbucket.org/b_c/jose4j/wiki/Home,JOSE/JWT的主要Java实现 –

回答

1

这是我遵循

创建密钥库

的keytool -genkey -keyalg RSA -alias -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"); 
+0

您能否澄清一下keyEntry从哪里来? –

+0

'PrivateKeyEntry keyEntry =(PrivateKeyEntry)ks.getKey(“selfsigned”,“password”.toCharArray());' –

+0

不兼容的类型:密钥不能转换为PrivateKeyEntry - 我猜getKey返回的密钥不能转换为PrivateKeyEntry ... :( –