如何以编程方式将可信证书导入现有密钥库?

我需要将一个可信证书导入到一个已经存在的密钥库中,这是我的代码,但它给我一个EOFException,可能是什么错误?

public void importTrustedCertificate( String alias, byte [] trustedCertificate ) throws Exception { KeyStore keyStore = KeyStore.getInstance( "JKS" ); FileInputStream fileInputStream = new FileInputStream( "keystore" + File.separator + "ClientRegistrarKeyStore.jks" ); FileOutputStream fileOutputStream = new FileOutputStream( "keystore" + File.separator + "ClientRegistrarKeyStore.jks" ); keyStore.load( fileInputStream, "keystore".toCharArray() ); keyStore.setCertificateEntry( alias, new X509Certificate( trustedCertificate ) ); keyStore.store( fileOutputStream, "keystore".toCharArray() ); fileInputStream.close(); fileOutputStream.close(); return; } 

错误:

 Exception in thread "main" java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:375) at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:628) at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:38) at java.security.KeyStore.load(KeyStore.java:1185) at com.netrust.passportverification.clientregistrar.setup.IniFileGenerator.importTrustedCertificate(IniFileGenerator.java:107) at com.netrust.passportverification.clientregistrar.setup.IniFileGenerator.processZipFile(IniFileGenerator.java:165) at com.netrust.passportverification.clientregistrar.setup.IniFileGenerator.main(IniFileGenerator.java:180) Java Result: 1 

你确定这个位置的文件不是空的吗? keytool可以列出其内容吗? 此EOFException看起来并不特定于密钥库,但似乎您尝试加载的初始文件比它应该更短。

此外,您的FileInputStreamFileOutputStream引用相同的文件。 我建议在写入另一个之前关闭你读的那个,以避免冲突:

 FileInputStream fileInputStream = new FileInputStream( "keystore" + File.separator + "ClientRegistrarKeyStore.jks" ); keyStore.load( fileInputStream, "keystore".toCharArray() ); fileInputStream.close(); keyStore.setCertificateEntry( alias, new X509Certificate( trustedCertificate ) ); FileOutputStream fileOutputStream = new FileOutputStream( "keystore" + File.separator + "ClientRegistrarKeyStore.jks" ); keyStore.store( fileOutputStream, "keystore".toCharArray() ); fileOutputStream.close(); 

试试这个……

证书证书= keyStore.getCertificate(别名);

keyStore.setCertificateEntry(别名,证书);