Ошибка разбора Algid, не последовательность - PullRequest
42 голосов
/ 02 июля 2011

При попытке прочитать закрытый ключ RSA из файла методом

public PrivateKey getPrivateKey()
        throws NoSuchAlgorithmException,
        InvalidKeySpecException, IOException {

    final InputStream inputStream = getClass().getClassLoader()
                    .getResourceAsStream("privatekey");
    byte[] privKeyBytes = null;
    try {
        privKeyBytes = IOUtils.toByteArray(inputStream);
    } catch (final IOException exception) {
        LOGGER.error("", exception);
        IOUtils.closeQuietly(inputStream);
    }

    LOGGER.debug("privKeyBytes: {}", privKeyBytes);

    String BEGIN = "-----BEGIN RSA PRIVATE KEY-----";
    String END = "-----END RSA PRIVATE KEY-----";
    String str = new String(privKeyBytes);
    if (str.contains(BEGIN) && str.contains(END)) {
        str = str.substring(BEGIN.length(), str.lastIndexOf(END));
    }

    KeyFactory fac = KeyFactory.getInstance("RSA");
    EncodedKeySpec privKeySpec =
            new PKCS8EncodedKeySpec(Base64.decode(str.getBytes()));
    return fac.generatePrivate(privKeySpec);
}

Я получаю исключение

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:200) ~[na:1.6.0_23]
    at java.security.KeyFactory.generatePrivate(KeyFactory.java:342) ~[na:1.6.0_23]

при вызове fac.generatePrivate (privKeySpec).

Что означает эта ошибка?

Спасибо

Дмитрий

Ответы [ 3 ]

55 голосов
/ 20 сентября 2013

У меня возникла та же проблема, и формат ключа НЕ был настоящей проблемой.
Все, что мне нужно было сделать, чтобы избавиться от этого исключения, это вызвать

java.security.Security.addProvider(
         new org.bouncycastle.jce.provider.BouncyCastleProvider()
);


и все заработало

51 голосов
/ 03 июля 2011

Это означает, что ваш ключ не в формате PKCS # 8.Самое простое - использовать команду openssl pkcs8 -topk8 <...other options...> для однократного преобразования ключа.В качестве альтернативы вы можете использовать PEMReader класс Bouncycastle облегченного API .

16 голосов
/ 28 октября 2017

Вы должны создать файл PCKS8 из личного ключа!

private.pem => имя файла личного ключа

openssl genrsa -out private.pem 1024

public_key.pem => имя файла открытого ключа

openssl rsa -in private.pem -pubout -outform PEM -out public_key.pem

private_key.pem => имя закрытого ключа в формате PCKS8! Вы можете просто прочитать этот формат в Java

openssl pkcs8 -topk8 -информ PEM -в приватном.pem -в приватном ключе.pem -nocrypt

...