最新版本的Java不支持ECC Brainpool曲线。当我读到包含EC Curve Brainpool的X509Certificate时,我得到了一个例外。
我发现Java不支持Brainpool曲线的证书。有没有办法自己添加这种支持?
答案 0 :(得分:4)
Bouncy Castle支持这些曲线。诀窍是Java仍然必须知道它们才能找到它们。所以你不能只是添加Bouncy Castle提供商并完成它。您需要明确使用Bouncy Castle的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 Castle特定代码(即直接使用Bouncy类而不是通过JCA使用它们):
ECPublicKey publicKey = (ECPublicKey) generatedCertificate.getPublicKey();
// Bouncy Castle specific class
ECNamedCurveSpec params = (ECNamedCurveSpec) publicKey.getParams();
System.out.println(params.getName());
几乎忘了:你需要在类路径中同时使用Bouncy Castle提供程序和 PKIX jar文件来执行此操作。
下载Java的无限加密文件也不会受到伤害,虽然这个功能可能不是直接需要的(尽管比抱歉更安全)。