2017-10-03 6 views
0

자바의 개인 키로 JWT를 만들려고합니다. 개인 키가 파일에 있습니다.Poynt 자바의 개인 키에서 JWT 만들기

내 방법입니다.

java.security.InvalidKeyException :

protected String prepareJWT() throws NoSuchAlgorithmException, InvalidKeySpecException, JOSEException { 

    String poyntPrivateKey = this.getPoyntPrivateKey(); 
    byte[] privateBytes = poyntPrivateKey.getBytes(); 
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateBytes); 
    KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 

    PrivateKey privateKey = keyFactory.generatePrivate(keySpec); 

    JWSSigner signer = new RSASSASigner((RSAPrivateKey) privateKey); 
    ... 

} 

나는 메시지와 함께 keyFactory.generatePrivate(keySpec);에서 예외가 잘못된 키 형식을 여기

와 여기 getPoyntPrivateKey()

protected String getPoyntPrivateKey() { 
    File file = new File("resources/poynt_api_private_key.txt"); 
    StringBuilder privateKeyBuilder = new StringBuilder(); 
    String privateKey = privateKeyBuilder.toString(); 
    try { 
     FileReader fr = new FileReader(file); 
     Scanner scanner = new Scanner(fr); 
     while(scanner.hasNextLine()) { 
      privateKeyBuilder.append(scanner.nextLine() + "\r"); 
     } 
     scanner.close(); 
     privateKey = privateKeyBuilder.toString(); 
    } catch (Exception e) { 
     privateKey = "Error"; 

    } finally { 

    } 

    return privateKey; 

} 

답변

2

당신 go (com.nimbusds.jwt. * 및 org.bouncyc 사용) astle.openssl. *) :

private static String getJWT() throws Exception{ 

    File f = new File(privateKeyFile); 
    InputStreamReader isr = new InputStreamReader(new FileInputStream(f)); 

    PEMParser pemParser = new PEMParser(isr); 
    Object object = pemParser.readObject(); 
    PEMKeyPair kp = (PEMKeyPair) object; 
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 
    RSAPrivateKey privateKey = (RSAPrivateKey) converter.getPrivateKey(kp.getPrivateKeyInfo()); 
    pemParser.close(); 


    // Create RSA-signer with the private key 
    JWSSigner signer = new RSASSASigner(privateKey); 

    // Prepare JWT with claims set 
    JWTClaimsSet claimsSet = new JWTClaimsSet(); 
    claimsSet.setSubject(applicationId); 
    claimsSet.setAudience(Arrays.asList(apiEndpoint)); 
    claimsSet.setIssuer(applicationId); 
    claimsSet.setExpirationTime(new Date(new Date().getTime() + 360 * 1000)); 

    claimsSet.setIssueTime(new Date(new Date().getTime())); 
    claimsSet.setJWTID(UUID.randomUUID().toString()); 

    SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claimsSet); 

    // Compute the RSA signature 
    signedJWT.sign(signer); 

    String s = signedJWT.serialize(); 
    return s; 
} 
+0

감사합니다. 나는 openssl을 사용하여 수동으로 키를 변환했다. –