欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > Java SSL使用Openssl ECC加密生成证书遇到的坑

Java SSL使用Openssl ECC加密生成证书遇到的坑

2024/11/30 9:00:05 来源:https://blog.csdn.net/NN955/article/details/142815849  浏览:    关键词:Java SSL使用Openssl ECC加密生成证书遇到的坑

之前一致使用传统的RSA加密方式生成的证书,网络也很好找资料没啥问题。但是切换到ECC加密后遇到各种问题,网上关于ECC加密证书的相关内容比较少。记录一下

1.确认Java版本是否支持ECC加解密算法

2.证书私钥无法解析

  证书格式PEM的可以直接打开查看到文本内容这样的:

-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgQ3w1tYqM23IWEBlIJRNA
/s9297Kt30Cn3eFkkWbUitKhRANCAARPu3+IOeXERFQY0jEU2i5gd79LieyxPU4x
a9uB274kutATCn0hX0OXBwKeZ8/OKnmEy61zGWtbtWLaxRnSkDeg
-----END PRIVATE KEY-----

之前RSA私钥读取直接使用PEMParser即可:

PEMParser pemParser = new PEMParser(new FileReader(keyFile));Object object = pemParser.readObject();JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");KeyPair key = converter.getKeyPair((PEMKeyPair) object);PrivateKey pk = key.getPrivate();pemParser.close();

换成ECC的无法加载,需要使用PKCS8EncodedKeySpec:

 String keyString = "MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgQ3w1tYqM23IWEBlIJRNA" +"/s9297Kt30Cn3eFkkWbUitKhRANCAARPu3+IOeXERFQY0jEU2i5gd79LieyxPU4x" +"a9uB274kutATCn0hX0OXBwKeZ8/OKnmEy61zGWtbtWLaxRnSkDeg";byte[] keyBytes = Base64.getDecoder().decode(keyString);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes, "secp256k1");KeyFactory keyFactory = KeyFactory.getInstance("EC");PrivateKey pk = keyFactory.generatePrivate(keySpec);

secp256k1曲线加密算法根据实际情况调整即可

有些OpenSSL的版本不同导致生成的ECC私钥格式不一样,可能是SEC1格式的,Java默认只支持PKCS8格式。这里有2种解决方法:(1)做格式转换。转换命令:

openssl pkcs8 -topk8 -in client.key -out client3.key -nocrypt

         参考文章: Java 读取private Key - 简书 也可以使用文章中直接读取SEC格式的方法

          (2)自定义读取SEC格式方法:

 byte[] keyBytes = Base64.getDecoder().decode(keyString);ASN1Sequence seq = ASN1Sequence.getInstance(keyBytes);org.bouncycastle.asn1.sec.ECPrivateKey pKey = org.bouncycastle.asn1.sec.ECPrivateKey.getInstance(seq);AlgorithmIdentifier algId = new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, pKey.getParameters());byte[] server_pkcs8 = new PrivateKeyInfo(algId, pKey).getEncoded();KeyFactory fact = KeyFactory.getInstance ("EC");PrivateKey pkey = fact.generatePrivate (new PKCS8EncodedKeySpec(server_pkcs8));

3.测试环境证书可能指定了主机IP地址,请使用证书内配置好的IP建链!127.0.0.1可能拒绝连接、

4.查看Java握手日志方法:在启动参数加上  -Djavax.net.debug=all

-Xms128m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="%RUNHOME%dumps" -Djavax.net.debug=all

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com