我正在使用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吗?
答案 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的实施可能是不合规的。