.InvalidKeyException: IOException: несоответствие версии при создании закрытого ключа с использованием файла PEM.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 .InvalidKeyException: IOException: несоответствие версии при создании закрытого ключа с использованием файла PEM.

Сообщение Anonymous »


У меня есть файл .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-----
JwtSigner1.java:

Код: Выделить всё

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 can't use the OpenSSL command line, because I have to programmatically use this pem file and directly convert it to a PrivateKey using Java.
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»