【问题标题】:Java ECC Brainpool support for certificates?Java ECC Brainpool 对证书的支持?
【发布时间】:2015-07-13 16:23:52
【问题描述】:

最新版本的 Java 不支持 ECC Brainpool 曲线。当我阅读包含 EC 曲线脑池的 X509Certificate 时,我得到了一个例外。

我发现 Java 不支持具有 Brainpool 曲线的证书。有没有办法自己添加这种支持?

【问题讨论】:

  • 您是否可以发布证书(使用 base64 编码或 PEM?)我可能会写一个答案,但是这台机器没有准备好测试的任何证书。
  • 是的,它就是其中之一。我在 PEM 的此处 (pastebin.com/CAMPLMfx) 上传了它,因为它太长了作为评论发布。
  • 好的,必须下载 BC 提供程序并输入一些内容,但解决方案相对简单。

标签: java cryptography elliptic-curve


【解决方案1】:

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

所以改用下面的代码sn -p /解决方案:

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 下载无限制的加密文件也没有什么坏处,尽管此功能可能并不直接需要它(尽管安全总比抱歉好)。对于较新的 Java 版本,这可能不再需要。

【讨论】:

  • 谢谢!将 BC Provder 添加到 Security 和 CertificateFactory 确实像我想要的那样工作:) 谢谢!另一个问题:如果我打印出 key.getParameters() 我没有得到曲线的名称(这里:brainpoolP256r1),使用旧的原始 java 代码我从其他 EC 曲线中得到名称,但现在我只得到: org.bouncycastle.jce.spec.ECParameterSpec@4af0acaf - 有什么想法吗?
  • OK 也解决了这个问题,但您需要 Bouncy 特定代码。
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2014-05-10
  • 2018-12-13
相关资源
最近更新 更多