web-dev-qa-db-ja.com

シーケンスではなく、アルジッド解析エラー

メソッドを使用してファイルから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)呼び出しで。

このエラーはどういう意味ですか?

ありがとう

ドミトリ

43
DP_

キーがPKCS#8形式ではないことを意味します。最も簡単なことは、openssl pkcs8 -topk8 <...other options...>コマンドでキーを1回変換します。または、 PEMReaderBouncycastle lightweight API のクラスを使用できます。

55
James K Polk

私はこれと同じ問題を抱えていましたが、キーの形式は実際の問題ではありませんでした。
その例外を取り除くために私がしなければならなかったのは、

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


そしてすべてがうまくいった

58
Dimitris

秘密鍵から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 -inform PEM -in private.pem -out private_key.pem -nocrypt
16
Pasha Gharibi