Не получается получить объект 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();
}
→ Ссылка