Не получается получить объект PublicKey из файла *.pem
Всем привет!
Нужна помощь, стоит задача валедировать JWT, но для этого нужно предварительно получить объект публичного ключа из файла. Собственно тут и возникла проблема. Получаю ошибку: java.security.InvalidKeyException: IOException: ObjectIdentifier() -- data isn't an object ID (tag = -96)
Пробовал с разными сертификатами, аналогичная ошибка.
К примеру сертификат stackoverflow,
у него:

main:
public static void main(String[] args) throws NoSuchAlgorithmException {
String pathResource = "key/stackexchange-com.pem";
ECPublicKey publicKey = null;
try {
publicKey = (ECPublicKey) PemUtils.loadPublicKeyAsPEM(pathResource, "RSA"); // для моего сертификата применяю EC, см. первый скрин, но ошибка та же
} catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Код метода loadPublicKeyAsPEM:
public static PublicKey loadPublicKeyAsPEM(String path, String algorithm)
throws IOException, NoSuchAlgorithmException,InvalidKeySpecException {
File file = new File(path);
InputStream inputStream = new FileInputStream(file);
InputStreamReader inputStreamReader= new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
String readd="";
StringBuffer stringBuffer=new StringBuffer();
while ((readd=bufferedReader.readLine())!=null) {
stringBuffer.append(readd);
}
inputStream.close();
String content=stringBuffer.toString();
String strPublicKey = content.replace("-----BEGIN CERTIFICATE-----", "")
.replace("-----END CERTIFICATE-----", "").replace("\n", "");
byte[] asBytes = Base64Utils.decode(strPublicKey.getBytes());
byte[] data = Base64.decodeBase64(strPublicKey);
X509EncodedKeySpec spec = new X509EncodedKeySpec(asBytes);
System.out.println(spec.getEncoded().toString());
System.out.println(spec.getFormat());
System.out.println(spec.getAlgorithm());
System.out.println("----------------------------------------");
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
System.out.println(keyFactory);
System.out.println(keyFactory.getAlgorithm());
System.out.println(keyFactory.getProvider());
System.out.println("----------------------------------------");
return keyFactory.generatePublic(spec);
}
Получаю ошибку:
Ответы (1 шт):
Автор решения: Mak Q
→ Ссылка
Для сертификатов нужно применять CertificateFactory. Подсказали в другом месте.
public static PublicKey loadPublicKeyAsPEM(String path, String algorithm)
throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, CertificateException {
File file = new File(path);
InputStream inputStream = new FileInputStream(file);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
Certificate certificate = certificateFactory.generateCertificate(inputStream);
inputStream.close();
return certificate.getPublicKey();
}


