2011-09-13 53 views
11

我生成使用keytool命令證書:PKCS#12:DerInputStream.getLength()異常

keytool -genkeypair -alias myRSAKey -keyalg RSA -keysize 1024 -keystore test.p12 -storepass test -storetype pkcs12 

然後,如果我嘗試加載用java安全API它,得到該文件作爲字節之後[] :

KeyStore ks = KeyStore.getInstance("PKCS12"); 
try{ 
    ks.load(new ByteArrayInputStream(data), "test".toCharArray()) 
} catch (Exception e){ 
    ... 
} 

我得到一個DerInputStream.getLength():lengthTag = 127,太大的異常。

出了什麼問題?

回答

10

我有這個問題,我搜索了谷歌的深度,仍然找不到答案。經過幾天與質量糟糕的遺留代碼爭鬥後,我發現是什麼導致了這個錯誤。

KeyStore.load(InputStream is, String pass); 

這種方法獲取InputStream,如果有這樣的InputStream的任何問題,這會拋出異常,我已經遇到了一些問題:

  • InputStream的指向錯誤/空/只創建的文件
  • 的InputStream爲已打開或別的東西,是抱着
  • InputStream的已經使用和資源閱讀,因此下一個字節的位置InputStream是結尾

最後一個是我的問題的責任。代碼是從證書創建一個InputStream,然後繼續在兩個KeyStore.load()調用中使用它,第一個成功,第二個總是讓我出現這個錯誤。

+0

謝謝。錯誤信息是真的令人誤解。在我的情況'數據'(關鍵)是一個空的字節數組,並導致這個錯誤。所有,因爲我重用了輸入流。 – Stroboskop

+2

第一個原因是你指出它是IMO最常見的原因:通常是錯誤的文件。也就是說,當我嘗試通過'KeyStore.getInstance(「PKCS12」)'或反轉':)''使用'JKS'密鑰庫文件時,有時會發生這種情況。 – albciff

7

可能是您創建的證書在最後有一個額外的字符,被誤解爲另一個證書。 最後使用一個或多個空行。

請參閱:Java Certificate Parsing

+0

是的,我已經檢查,因爲我有一個x509證書類似的錯誤,但事實並非如此。感謝您的回答,我會爲它+1,因爲它可能是問題所在。 – karlipoppins

+1

看起來像鏈接已死。 –

+0

@AniketThakur:我修復了這個鏈接。你現在可以參考它。 – Amanpreet

0

你在做錯事。
我試過你的命令,然後加載p12就好了。
下面的代碼工作:

FileInputStream fin = new FileInputStream("..\\test.p12"); 
KeyStore ks = KeyStore.getInstance("PKCS12"); 
ks.load(fin, "123456".toCharArray()); 
System.out.println(ks.getCertificate("myrsakey")); 

如果你把命令是從密鑰工具,密碼必須至少6個字符得到一個錯誤,我想知道。
你沒有得到那個錯誤?你使用的是什麼版本的Java?
注意:如果您需要創建證書,您還可以查看此工具。
http://sourceforge.net/projects/certhelper/

3

對於其他類似的問題:

"keystore load: DerInputStream.getLength(): lengthTag=109, too big." 

對我來說,解決方法是刪除帕拉姆:由於標準型爲JKS

-1

在EG的代碼 指定的證書類型-storetype pkcs12

System.setProperty("javax.net.ssl.trustStoreType", "jks"); 
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 
0

我有同樣的問題。

我的解決方案是用下面一行中的jceks替換PKCS12,因爲我顯然使用了錯誤的類型。

KeyStore clientStore = KeyStore.getInstance("PKCS12"); 
相關問題