2016-06-13 87 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 ... :( –