У меня есть файл .pem, и я пытаюсь сгенерировать из него PrivateKey, чтобы создать JWT (веб-токен JSON), подписанный этим закрытым ключом. Однако код прерывается при выполнении KeyFactory.generatePrivate(keySpec). Ниже приведено содержимое файла .pem, в котором присутствует ключ, и файла Java
файла mysecret1.pem
Код: Выделить всё
-----BEGIN PRIVATE KEY----- MIGkAgEBBDAz2He6GHzqEe+a2MAl/3QyuvnCsGQrFYKmP/F9mX7lhjYBqN/wJBQd ppqjhVPFiF+gBwYFK4EEACKhZANiAAQvEqdP8J+IkWrx2WA9EEblRiZPaRY9drWI aNFGI24rMBbx5SPd+OkLEOPx1Z5QOJlhdkKtwGsNZRklXGBwFwy/sYV+bRt/bt5O 6SfitF4XZvewKafZ8YaxPklhdloWe+I= -----END PRIVATE KEY-----
Код: Выделить всё
public class JwtSigner1 {
private static final long EXPIRY_DURATION = 1000L * 60 * 60 * 1; // 1 hour
public static void main(String[] args) throws Exception {
File file = new File("mysecret1.pem");
System.out.println(JwtSigner1.generateTokenUsingPemFile(file));
}
public static String generateTokenUsingPemFile(File file) throws Exception {
Security.addProvider(new BouncyCastleProvider());
String key = new String(Files.readAllBytes(file.toPath()), Charset.defaultCharset());
String privateKeyPEM = key.replace("-----BEGIN PRIVATE KEY-----", "").replaceAll(System.lineSeparator(), "")
.replace("-----END PRIVATE KEY-----", "");
byte[] encoded = Base64.getDecoder().decode(privateKeyPEM);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
Map claims = new HashMap();
claims.put("data", " app");
claims.put("namespace", "sample");
return Jwts.builder().setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + EXPIRY_DURATION))
.setIssuedAt(new Date(System.currentTimeMillis())).signWith(privateKey).compact();
}
}
Код: Выделить всё
Exception in thread "main" java.security.spec.InvalidKeySpecException:
java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)
at c.s.v.d.w.c.util.JwtSigner1.generateTokenUsingPemFile(JwtSigner1.java:41)
at c.s.v.d.w.c.util.JwtSigner1.main(JwtSigner1.java:28)
Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:351)
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:356)
at sun.security.rsa.RSAPrivateCrtKeyImpl.(RSAPrivateCrtKeyImpl.java:91)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)
at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316)
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213) ... 3 more
I expect a Private Key to be created and using that a JWT token is generated, which is signed by this key.
Источник: https://stackoverflow.com/questions/781 ... -a-private