首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java.Security CertificateFactory.getInstance随机失败

Java.Security CertificateFactory.getInstance随机失败
EN

Stack Overflow用户
提问于 2022-05-10 10:04:52
回答 1查看 169关注 0票数 1

我遇到了一个奇怪的问题,结果我的测试随机失败。请参阅以下示例:

代码语言:javascript
复制
val certificateFactory = CertificateFactory.getInstance("X509")

我正在尝试获取证书工厂的一个实例,以便从我的测试资源文件夹中的文件中生成一个X509Certificate。在运行了几次测试之后,我发现这是随机失败的,但有以下例外:

代码语言:javascript
复制
X509 not found
java.security.cert.CertificateException: X509 not found
    at java.base@17/java.security.cert.CertificateFactory.getInstance

在互联网上进行了一些研究后,我发现有些人倾向于使用X.509而不是X509。将CertificateFactory.getInstance("X509")改为CertificateFactory.getInstance("X.509")会导致完全相同的行为:大约75%的测试通过,而在其他情况下则不然。

我的最后一次尝试是在尝试获得一个X.509实例失败时回到X509上,如下所示:

代码语言:javascript
复制
val certificateFactory = try {
                CertificateFactory.getInstance("X509")
            } catch (ex: CertificateException) {
                println("CertificateFactory instance for X509 not found, attempting with X.509")
                CertificateFactory.getInstance("X.509")
            }

这并没有改变测试的结果。

从这个小实验中可以看出,CertificateFactory有时确实包含"X509“和"X.509”的实例,有时却不包含这两个实例。是否有可能CertificateFactory有时没有被正确初始化,或者类似的情况?

代码是用Kotlin编写的,运行在以下Java版本上:

代码语言:javascript
复制
openjdk version "17" 2021-09-14
OpenJDK Runtime Environment Temurin-17+35 (build 17+35)
OpenJDK 64-Bit Server VM Temurin-17+35 (build 17+35, mixed mode, sharing)

我在网上找不到很多关于这个用例的东西,所以我在这里试着碰运气。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-05-10 11:59:50

Meta:不是一个真正的答案,至少还没有,但是太多了,不能发表评论。如有需要,我会删除。

我忽略了科特林,因为我不认为这有任何关系,尽管我可能错了。在任何情况下,您都应该能够很容易地在普通Java中测试这个特定特性。

CertificateFactory is "X.509" with the dot的JCA标准类型(又名算法)名称一直都是(至少返回到Java5)。我不确定PKCS11提供程序是否能够支持这个API,但如果支持这个API,则会根据底层P11设备或库的不同而有所不同。(传统的P11设备,即真正的HSM,并不涉及证书管理,只涉及有限的处理,但随着时间的推移,P11已经被使用,或者可能被滥用,用于如此广泛的事情,我不愿对此做出任何一般性的声明。)

如果您安装了the provider,那么除了"X.509"之外,它还提供"X509"作为别名/同义词(但绝不作为替代)。

我建议您在尝试/失败时检查提供者的配置情况--比如

代码语言:javascript
复制
import java.security.*;
...
for( Provider p : Security.getProviders() ) System.out.println (p.getName());

如果SUN或BC都存在,那么getInstance("X.509")应该可以工作,如果两者都不存在,我看不出您想在JVM中执行的其他任何操作将如何工作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72184326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档