9

我正在尝试使用 Java 读取从外部方收到的证书。代码抛出以下错误:

java.lang.RuntimeException:java.security.cert.CertificateException:无法初始化,java.io.IOException:给 DerValue 构造函数的额外数据

编码:

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

为了确保问题不在代码中,我创建了一个自签名证书并将其与代码一起使用,它运行良好。我已经在系统密钥链中安装了这两个证书,它们都是有效的。我使用的是 Mac 和 Java 1.6。

知道为什么在加载外部方证书时会出现上述异常吗?您认为它在传输过程中损坏了吗?如果是这样,它不应该在本地系统上显示为有效,对吧?

4

1 回答 1

8

尝试使用 openssl 输入,然后导入结果:

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

或者在轻量级 API 中使用 Java Bouncy Castle 功能:

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

您可以再次对结果进行编码,然后使用"X509" CertificateBuilderJava 中的 获取 JCE 定义的证书,例如

ByteArrayInputStream certStream  =  new ByteArrayInputStream(binaryCert);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(certStream);
于 2012-07-23T22:30:34.080 回答