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

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

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

2.证书私钥无法解析

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

bash 复制代码
-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgQ3w1tYqM23IWEBlIJRNA
/s9297Kt30Cn3eFkkWbUitKhRANCAARPu3+IOeXERFQY0jEU2i5gd79LieyxPU4x
a9uB274kutATCn0hX0OXBwKeZ8/OKnmEy61zGWtbtWLaxRnSkDeg
-----END PRIVATE KEY-----

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

java 复制代码
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:

java 复制代码
 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)做格式转换。转换命令:

bash 复制代码
openssl pkcs8 -topk8 -in client.key -out client3.key -nocrypt

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

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

java 复制代码
 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

bash 复制代码
-Xms128m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="%RUNHOME%dumps" -Djavax.net.debug=all
相关推荐
二十雨辰6 小时前
[python]-循环语句
服务器·python
wypywyp7 小时前
2.虚拟机一直显示黑屏,无法打开,可能是分配的硬盘空间不够
linux·运维·服务器
SongYuLong的博客7 小时前
TL-WR710N-V2.1 硬改刷机OpenWRT源码编译固件
linux·物联网·网络协议
m0_737302587 小时前
碳足迹精准计量,华为FusionSolar助力云服务器绿色运维
服务器
Howrun77711 小时前
Linux_C++网络编程四种CS模型
linux·运维·服务器
vortex511 小时前
如何快速删除 Linux 中的海量小文件:告别rm命令的缓慢困境
linux·运维·服务器
AUTOSAR组织12 小时前
深入解析AUTOSAR框架下的TCP/IP协议栈
网络协议·tcp/ip·汽车·autosar·软件架构·软件·培训
googleccsdn12 小时前
ENSP Pro LAB笔记:配置M-LAG双归接入三层网络(V-STP + Monitor Link + OSPF)
网络·笔记·网络协议
RisunJan13 小时前
Linux命令-ldd(查看可执行程序或共享库所依赖的动态链接库)
linux·运维·服务器
实心儿儿13 小时前
Linux —— 进程概念 - 进程运行、阻塞、挂起状态
linux·运维·服务器