Я пытаюсь прочитать закрытый ключ поколения JWT
, но получаю ошибку:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: null.
Я упростил код, чтобы использовать действительный ключ base64
, но все равно получил эту ошибку.
private PrivateKey getPrivateKey() throws Exception
{
String privateKeyPEMFormatted =
"MIIBVgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAzPUG7l/N0B5wr7TxF0+5Uxl5GZJ9N7ck+l5lUGM3yMR5YVqekZ6J0ON5nFfTmT3Tx5h+u5YKhzZ/bHYf8bFg9wIDAQABAkAAvNjEzfDbBVeBGWRCGhfM4kQFdyI9IoO2HJ6WgdSZK/LQvdSMbJf6e4O08Kj2FSq+O1WLPoT3sQ4lNaaRQ+2hAiEA+u5tQFcmFUVZsZb+uD/FXNdBlRXI/D7L4Ib4Nnb3OgECIQDYfhFPBeROr9tQRYNhuWmfGAtSjaKlG2cGQXYMlyiNVwIgCcLr5G6eGHiz7E9aPyRQo/1Wn+5x3w9Z0P1pX6QEzL8CIQCET+ZWAA8lfvTofU8QzXpJcN9L5xROOZ1TGyz+jmiOFQIhAK9F1mpOKkFdTLDXrdypo+5rAhnxqV2P9Hp+1vKQtZ9x";
byte[] decoded =Base64.getDecoder().decode(privateKeyPEMFormatted);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}
Прочитал все посты на эту тему, но решения так и не нашел...
И это тоже не ПЕМ. PEM — это НЕ просто base64. PEM — это base64 С разрывами строк И граничными линиями; необходимы все три, а не только один. (В некоторых случаях может быть четвертый элемент, атрибуты в стиле 822, но сейчас они встречаются редко, и их нет в одобренном IETF RFC 7468.) Если бы ключевые данные здесь были действительными, их можно было бы правильно описать как base64- закодированный (или отформатированный) PKCS8.
Во-первых, ваш ключ Base64 каким-то образом поврежден. Ваш код подходит для примера закрытого ключа, следующего из здесь.
private PrivateKey getPrivateKey() throws Exception
{
String privateKeyPEMFormatted =
"MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqPfgaTEWEP3S9w0tgsicURfo+nLW09/0KfOPinhYZ4ouzU+3xC4pSlEp8Ut9FgL0AgqNslNaK34Kq+NZjO9DAQIDAQABAkAgkuLEHLaqkWhLgNKagSajeobLS3rPT0Agm0f7k55FXVt743hwNgkp98bMNrzy9AQ1mJGbQZGrpr4c8ZAx3aRNAiEAoxK/MgGeeLui385KJ7ZOYktjhLBNAB69fKwTZFsUNh0CIQEJQRpFCcydunv2bENcN/oBTRw39E8GNv2pIcNxZkcbNQIgbYSzn3Py6AasNj6nEtCfB+i1p3F35TK/87DlPSrmAgkCIQDJLhFoj1gbwRbH/bDRPrtlRUDDx44wHoEhSDRdy77eiQIgE6z/k6I+ChN1LLttwX0galITxmAYrOBhBVl433tgTTQ = ";
byte[] decoded = Base64.getDecoder().decode(privateKeyPEMFormatted);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}
Я считаю, что правильный способ прочитать закрытый ключ в формате PEM вот так
Боюсь, это недействительный ключ