2011-07-02 22 views
25

Algid解析エラー、シーケンスではありません

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); 
} 

私はfac.generatePrivateで例外に

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] 

を取得する方法を使用して(privKeySpecを)ファイルからのRSA秘密鍵を読み取ろうとするときコール。

このエラーは何を意味しますか?

おかげ

ドミトリ

答えて

37

それはあなたの鍵は、PKCS#8形式ではないことを意味します。一番簡単なのは、openssl pkcs8 -topk8 <...other options...>コマンドを使ってキーを一度変換することです。またはのPEMReaderクラスを使用することもできます。

+20

おかげで、この形式を読み取ることができ、それが働きました。コマンドは次のとおりです:openssl pkcs8 -topk8 -nocrypt -in myrsakey.pem -out myrsakey_pcks8 –

32

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

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


を呼び出すことだったし、すべてが私にとって

+0

このソリューションは本当にうまくいきました。ありがとう。 – user1919346

+0

これは解決策です!できます! – Denny

+0

解決策は機能しますが、それの背後にある根拠は何ですか? – user1918858

-1

を働いていた、私は、公開鍵にOIDがありませんでした。私はここからヘルプを使用してiOSの側でそれを修正する必要がありました:http://blog.wingsofhermes.org/?p=42

また、私の公開鍵はのRSAPublicKeyにキャストする必要はありませんでした、標準ではうまく働いた:

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(publicKeyBytes); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec); 
+1

opはプライベートキーについて話していた – lznt

4

をあなたがしなければなりません秘密鍵からPCKS8ファイルを作成してください!

private.pem =>秘密鍵ファイルの名前

opensslのgenrsa -out private.pem 1024

public_key.pem =>公開鍵ファイルの名前

のopensslのRSA秘密-in。 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

+1

これは私の問題でした。ファイルはPKCS#1フォーマットを作成する 'genrsa'を使って生成されました(これは' BEGIN RSA PRIVATE KEY'ヘッダで見られるようにOPが読み込むフォーマットです)一方、PKCS#8は異なるフォーマットです(PEMエンコーディングでは、異なるヘッダのために検出できます: 'BEGIN PRIVATE KEY')。私の鍵ジェネレータは次のようになります: 'openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -out private.pem' – Guss

+0

ECの秘密鍵用に同様の鍵生成器がありますか? –

関連する問題