我遇到了一个奇怪的问题,结果我的测试随机失败。请参阅以下示例:
val certificateFactory = CertificateFactory.getInstance("X509")我正在尝试获取证书工厂的一个实例,以便从我的测试资源文件夹中的文件中生成一个X509Certificate。在运行了几次测试之后,我发现这是随机失败的,但有以下例外:
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上,如下所示:
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版本上:
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)我在网上找不到很多关于这个用例的东西,所以我在这里试着碰运气。提前谢谢。
发布于 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"作为别名/同义词(但绝不作为替代)。
我建议您在尝试/失败时检查提供者的配置情况--比如
import java.security.*;
...
for( Provider p : Security.getProviders() ) System.out.println (p.getName());如果SUN或BC都存在,那么getInstance("X.509")应该可以工作,如果两者都不存在,我看不出您想在JVM中执行的其他任何操作将如何工作。
https://stackoverflow.com/questions/72184326
复制相似问题