【问题标题】:CertificateFactory returns null with non-certificate inputCertificateFactory 使用非证书输入返回 null
【发布时间】:2016-10-12 07:21:29
【问题描述】:

我使用java.security.cert.CertificateFactory 生成(来自InputStream),然后验证公共证书文件。当我使用正确的证书文件时,例如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 为空。我的问题是:
当输入非证书文件时,为什么 certificateFactory.generateCertificate(stream) 返回 null?它不应该抛出 CertificateException 吗?

【问题讨论】:

    标签: java x509certificate


    【解决方案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 的实现可能不合规。

    【讨论】:

    • 我的班级导入是:
    • 那真是令人尴尬。我的类导入是:import java.security.cert.CertificateFactory; 我没有使用 Java 的 CertificateFactory 吗?
    • 是的,你是,但是那个类并没有真正做任何工作。请参阅我在问题中链接到的源代码。这是偶然在 Android 上运行的吗?
    • 不,这是一个桌面应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2014-04-26
    • 2013-10-31
    • 2017-09-30
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多