【问题标题】:how to fix this exception: Exception in thread "main" java.lang.ClassCastException如何修复此异常:线程“main”中的异常 java.lang.ClassCastException
【发布时间】:2017-09-24 18:15:09
【问题描述】:

异常是:线程“main”中的异常 java.lang.ClassCastException: [Ljava.security.cert.Certificate;无法转换为 [Ljava.security.cert.X509Certificate;

在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));

    }

}

【问题讨论】:

    标签: java security x509certificate keystore private-key


    【解决方案1】:

    这是因为java编译器不知道getCertificateChain()方法返回的Certificate[]中的所有对象是否只包含X509Certificate[尽管X509Certificate是唯一扩展@987654325的类@类截至目前]。

    因此,如果您需要 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];
    

    【讨论】:

      【解决方案2】:

      试试这个

      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));
      
          }
      
      }
      

      知道如何使用 javax.security.cert.X509Certificate java.security.cert.X509Certificate

      【讨论】:

      • 谢谢你的回答,但是我想把Certificate[]转入类型X509Certificate[],不知道为什么会投失败。
      • 试试修改后的
      • X509Certificate[] certs1 = (X509Certificate[]) keystore.getCertificateChain(alias);使用相同但更改导入
      猜你喜欢
      • 1970-01-01
      • 2016-01-05
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多