2017-04-27 290 views
-1

异常是:线程“main”中的异常java.lang.ClassCastException:[Ljava.security.cert.Certificate;不能转换为[Ljava.security.cert.X509Certificate;如何解决此异常:线程“main”中的异常java.lang.ClassCastException

在keystore.jks文件

,它有一个入口,它的别名是 “/ btsmed-1/CERTH-1/necert-1”,在该证书链keystore.jks文件通过该方法设置成:

keystore.setKeyEntry(alias, Keys.keyPair().getPrivate(),KEY_STORE_PASSWORD.toCharArray(), certChain); 
keystore.store(out, KEY_STORE_PASSWORD.toCharArray()); 

之前我重新加载JKS密钥存储到,当执行该语句:

X509Certificate[] certs1 = (X509Certificate[])keystore.getCertificateChain(alias); 

它不会引发转换异常。

但在keystore.load(fIn,password)之后;它会抛出转换异常时,执行该语句:

X509Certificate[] certs1 = (X509Certificate[]) keystore.getCertificateChain(alias); 

====================下面是源代码。

public class KeystoreLoad { 

    public static void main(String[] args) throws Exception { 
     char[] password = "nokia123".toCharArray(); 
     String alias = "/btsmed-1/certh-1/necert-1"; 

     KeyStore keystore = KeyStore.getInstance("JKS"); 

     keystore.load(null, null); 

     FileInputStream fIn = new FileInputStream("d://keystore/keystore.jks"); 

     keystore.load(fIn, password); 

     X509Certificate[] certs1 = (X509Certificate[]) keystore.getCertificateChain(alias); 
     System.out.println(Arrays.toString(certs1)); 

    } 

} 

回答

0

试试这个

import java.io.FileInputStream; 
import java.security.KeyStore; 
import java.util.Arrays; 

import java.security.cert.X509Certificate; 

public class TestDemo { 

    public static void main(String[] args) throws Exception { 

     char[] password = "nokia123".toCharArray(); 
     String alias = "/btsmed-1/certh-1/necert-1"; 

     KeyStore keystore = KeyStore.getInstance("JKS"); 

     keystore.load(null, null); 

     FileInputStream fIn = new FileInputStream("d://keystore/keystore.jks"); 

     keystore.load(fIn, password); 
     keystore.getCertificateChain(alias); 
     X509Certificate[] certs1 = (X509Certificate[]) keystore.getCertificateChain(alias); 

     System.out.println(Arrays.toString(certs1)); 

    } 

} 

得到它insted的imporing javax.security.cert.X509Certificate使用 java.security.cert.X509Certificate

+0

感谢您的答案,但我想转让证书[]输入X509证书[],和我不不知道为什么它会失败。 – danny

+0

尝试修改后的一个 – Narendra

+0

X509Certificate [] certs1 =(X509Certificate [])keystore.getCertificateChain(alias);使用相同但更改导入 – Narendra

0

这是因为Java编译器没有按”的t知道getCertificateChain()方法返回的Certificate[]中的所有对象是否仅包含X509Certificate [尽管X509Certificate是扩展Certificate的唯一类到目前为止]。

所以如果你需要的X509Certificate[]你必须遍历Certificate[],象下面这样:

Certificate[] certChain = ks.getCertificateChain("ALIAS"); 

X509Certificate[] x509CertChain = new X509Certificate[certChain.length]; 
for (int i = 0; i < certChain.length; i++) 
    x509CertChain[i] = (X509Certificate) certChain[i]; 
相关问题