2012-07-23 274 views
8

我正嘗試使用Java讀取我從外部方接收到的證書。該代碼拋出以下錯誤:用Java讀取X.509證書

java.lang.RuntimeException: java.security.cert.CertificateException: Unable to initialize, java.io.IOException: extra data given to DerValue constructor

代碼:

FileInputStream ksfis = new FileInputStream(this.getCertificateFile()); 
ksbufin = new BufferedInputStream(ksfis); 
certificate = (X509Certificate) 
    CertificateFactory.getInstance("X.509").generateCertificate(ksbufin); 

爲了確保問題不是在代碼中,我創建了一個自簽名的證書,並與代碼中使用它,它運行良好。我已經在系統密鑰鏈中安裝了兩個證書,並且它們都是有效的。我正在使用Mac和Java 1.6。

任何想法,當我加載外部黨的證書時,爲什麼我得到上述異常?你認爲它在傳輸過程中損壞了嗎?如果有,它不應該在本地系統上顯示爲有效,對嗎?

+0

如果在文本編輯器中打開它,它會顯示文本還是垃圾? – 2012-07-23 22:27:31

+0

我在文本編輯器中打開了我的文件,它的完整垃圾和第三方之一整齊排列在BEGIN證書和END證書文本里,並且這兩個內部的內容都以==(base64編碼?) – Java 2012-07-23 22:30:06

+0

整齊排列在' ---- START CERTIFICATE ----- \ n base 64 junk \ n ----- END CERTIFICATE -----'我想? – 2012-07-23 22:31:52

回答

6

嘗試鍵入此使用OpenSSL的,然後導入結果:

openssl x509 -outform der -in certificate.pem -out certificate.der 

或輕量級API中使用Java充氣城堡的功能:

http://www.bouncycastle.org/docs/pkixdocs1.5on/org/bouncycastle/openssl/PEMReader.html

您可以編碼結果然後再使用Java中的默認CertificateBuilder來獲取JCE定義的證書。

+0

FWIW,BouncyCastle輕量級API給了我一個非常類似的錯誤。 – cmbaron 2013-05-06 22:40:07

+0

不是所有的證書都是一樣的,@cmbaron,我見過很多編碼錯誤。如果你確定你的代碼應該工作(詢問Bouncy郵件列表),那麼它也可以是你的證書。 – 2013-05-06 23:43:07