我正在尝试使用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。
当我加载外部Party证书时为什么会出现以上异常,你有任何想法吗?你认为它在传输过程中损坏了吗?如果是这样,它不应该在本地系统上显示为有效,对吗?
CertificateFactory
可以读取PEM或DER格式,尽管在7之前(非常接近此问题),它无法处理带有_额外数据的PEM块,例如某些程序 cough OpenSSL cough 添加的“注释”,并且会抛出一个错误的异常,错误地暗示PEM不受支持。另一方面,KeyFactory
只支持DER格式,而KeyStore
仅支持二进制格式(PKCS12的DER格式,JKS和JCEKS的Java序列化格式,但不支持PEM)。PEM格式的起始标记应该是BEGIN而不是START,并且连字符和单词之间不应该有空格。... - dave_thompson_085CertificateFactory
的输入流支持 PEM 格式。 - Maarten Bodewes