CertificateFactory返回null,带有非证书输入

时间:2016-10-11 20:27:43

标签: java x509certificate

我正在使用java.security.cert.CertificateFactory生成(来自InputStream),然后验证公共证书文件。当我使用正确的证书文件时,ex cert.cert我会获得一个合适的证书,可以生成指纹,用它来与服务器通信等。

但是,当我选择肯定不是证书的文件时,前settings.txt我有时会获得CertificateException,有时会获得null。我找不到CertificateFactory的这种行为的描述,或任何推理为什么某些文件导致generateCertificate抛出异常而不是返回null的原因。

我的代码有问题:

CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
InputStream stream = new ByteArrayInputStream(parameters.getCertificate());
X509Certificate cert = (X509Certificate)certificateFactory.generateCertificate(stream);


最后一行将返回异常,或者cert将为null。我的问题是:
为什么在给出非证书文件作为输入时,certificateFactory.generateCertificate(stream)会返回null?它不应该抛出CertificateException吗?

1 个答案:

答案 0 :(得分:1)

我发现这是一个有趣的问题。我对CertificateFactory.generateCertificate()文档的阅读使得一个案例不清楚,当流被定位在EOF时应该返回什么。我认为它应该产生一个例外。我相信null永远不会被退回。 java.security.cert.CertificateFactory类本身只是将generateCertificate()调用委托给内部spi类。 OpenJDK8's implementation of this spi class永远不会返回null。对于Oracle的实施,这也可能是正确的。因此,我必须得出结论,你没有使用这些实现之一。

当我检查Bouncycastle provider's implementation时,我看到它在几个地方返回null,包括当达到EOF时。 Bouncycastle的实施可能是不合规的。