【问题标题】:How do I import a trusted certificate into an existing keystore programmatically?如何以编程方式将受信任的证书导入现有的密钥库?
【发布时间】:2012-01-14 23:04:30
【问题描述】:

我需要将受信任的证书导入到已经存在的密钥库中,这是我的代码,但它向我抛出了 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

【问题讨论】:

  • 无法在第 7 行实例化类型 X509Certificates
  • 你能上传创建密钥库然后导入证书的完整代码吗?我有 pfx 证书,我可以导入该证书初始化吗?我正在使用安卓 2.3.3

标签: java ssl import certificate keystore


【解决方案1】:

试试这个...

证书证书 = keyStore.getCertificate(alias);

keyStore.setCertificateEntry(别名,证书);

【讨论】:

    【解决方案2】:

    您确定此位置的文件不为空吗? 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.setCertificateEntry( alias, new X509Certificate( trustedCertificate ) ); 上实例化 X509Certificate 类型
    • 您能帮我创建一个密钥库,然后将证书导入其中吗?我有 pfx 证书,我可以导入该证书初始化吗?我正在使用安卓 2.3.3。提前致谢
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    相关资源
    最近更新 更多