Как правильно прочитать частный ключ PEM

Я пытаюсь прочитать закрытый ключ поколения 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);
}

Прочитал все посты на эту тему, но решения так и не нашел...

Боюсь, это недействительный ключ

g00se 23.07.2024 18:35

И это тоже не ПЕМ. PEM — это НЕ просто base64. PEM — это base64 С разрывами строк И граничными линиями; необходимы все три, а не только один. (В некоторых случаях может быть четвертый элемент, атрибуты в стиле 822, но сейчас они встречаются редко, и их нет в одобренном IETF RFC 7468.) Если бы ключевые данные здесь были действительными, их можно было бы правильно описать как base64- закодированный (или отформатированный) PKCS8.

dave_thompson_085 23.07.2024 19:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, ваш ключ 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 вот так

Другие вопросы по теме