最新版本的Java不支持ECC脑池曲线。当我阅读一个包含EC曲线脑池的X509Certificate时,我会得到一个异常。
我发现Java不支持带有脑池曲线的证书。有什么办法让我自己增加这种支持吗?
发布于 2015-07-13 18:48:15
弹跳城堡支持这些曲线。诀窍是Java仍然需要了解它们才能找到它们。因此,您不能只是添加弹跳城堡提供商,并完成它。您需要显式地使用Bounsi城堡的CertificateFactory
。
如果您只使用了Java CertificateFactory
,就会遇到以下异常(您现在可能已经熟悉了这个异常):
Exception in thread "main" java.security.cert.CertificateParsingException: java.io.IOException: Unknown named curve: 1.3.36.3.3.2.8.1.1.7
因此,可以使用以下代码片段/解决方案:
Security.addProvider(new BouncyCastleProvider());
// explicit BC factory required, knows about curve!
CertificateFactory fact = CertificateFactory.getInstance("X509", BouncyCastleProvider.PROVIDER_NAME);
PemReader reader = new PemReader(new FileReader("ecc_certificate.txt"));
PemObject readPemObject = reader.readPemObject();
final byte[] cert = readPemObject.getContent();
Certificate generatedCertificate = fact.generateCertificate(new ByteArrayInputStream(cert));
System.out.println(generatedCertificate);
然而,要获得命名曲线的名称,您需要转到Bouncy城堡特定的代码(即直接使用Bouncy类而不是通过JCA使用它们):
ECPublicKey publicKey = (ECPublicKey) generatedCertificate.getPublicKey();
// Bouncy Castle specific class
ECNamedCurveSpec params = (ECNamedCurveSpec) publicKey.getParams();
System.out.println(params.getName());
几乎忘记了:要做到这一点,您需要类路径中的Bouncy城堡提供程序和PKIX jar文件。
下载用于Java的无限加密文件也不会有任何影响,尽管这种功能可能并不直接需要它(虽然比遗憾更安全)。对于更新的Java版本,这可能不再是必需的了。
发布于 2022-09-07 19:53:12
EC曲线脑池在Java 15 (问题)中已被禁用,并在Java 15之后被删除。解决方案是添加第三方库(如bcprov-jdk15on )。然后你只需要指出提供者。示例:
Security.addProvider(new BouncyCastleProvider()); // load third-party lib
Signature SHA256 = Signature.getInstance("SHA256withECDSA", "BC"); // use BC provider
使用这两行代码,您可以消除Java 15上的"Legacy SunEC曲线禁用“和Java >15中的”曲线不受支持“的异常。更多信息这里。以及如何在baeldung.com中使用JavaBenniy城堡的详细信息。
https://stackoverflow.com/questions/31388538
复制相似问题