2017-02-23 79 views
1

我在Java KeyStore中存储了我的证书,这是访问Restful API所必需的。要访问这个API,我需要创建JWT(Json Web Token),我正在用Java实现它。为了生成JWT,我需要用给定的私钥对有效载荷进行签名。 那么,我做的是,从.jks导入私有密钥文件到我的代码现在java - 需要从jks(java密钥库)导入私钥

FileInputStream is = new FileInputStream("src/main/resources/file.jks"); 
      KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      keystore.load(is, "password".toCharArray()); 
PrivateKey privateKey = (PrivateKey) keystore.getKey("key", "".toCharArray()); 
JWTClaimsSet claimsSetOne = new JWTClaimsSet.Builder() 
       .subject("alias") 
       .issueTime(new Date(123000L)) 
       .issuer("https://issuer") 
       .audience("https://audience") 
       .build(); 

JWSSigner signer = new RSASSASigner(privateKey); 
SignedJWT signedJWT = new SignedJWT (new JWSHeader(JWSAlgorithm.RS256), claimsSetOne); 
signedJWT.sign(signer); 
String orderOne = signedJWT.serialize(); 

,用这段代码,它返回私钥为“空”值。这导致我的代码失败。 那么,我的代码是什么,这样我就可以读取私钥来签署有效载荷来生成JWT。 或其他任何可以实现相同的选择。 在此先感谢。
编辑: 后来我试过这个命令,

File file = new File("src/main/resources/sho1.jks"); 
InputStream is = new FileInputStream(file); 
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
String password = "sho123"; 
keystore.load(is, password.toCharArray()); 

KeyStore.PrivateKeyEntry keyEnt = 
    (KeyStore.PrivateKeyEntry) keystore.getEntry("sho",new KeyStore.PasswordProtection(password.toCharArray())); 
PrivateKey privateKey = keyEnt.getPrivateKey(); 

它给了我错误的Invalid_Signature。

+0

您是如何将密钥导入密钥库的?是导入密钥时使用的别名的“钥匙”? – JEY

+0

我有一个.pfx文件。然后使用keytool命令,我将它导入到java密钥库中。 –

+0

你确定“key”是你的私钥的别名? – JEY

回答

1

JAVA代码的实现没有错。此代码工作正常。我得到的INVALID_SIGNATURE错误是由于JKS。我输入的证书不是正确的,即它没有正确的证书路径。我试图导入正确的方式,然后它的工作。 因此,请确保在这种情况下,您正在使用正确的密钥对导入证书,以便在JKS中获得正确的指纹。 谢谢大家。