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
相关推荐
春日见41 分钟前
python3语法学习
linux·运维·服务器·人工智能·驱动开发
wxjlkh1 小时前
ESXI的磁盘模式说明 -VMware Paravirtual——VMware 准虚拟/ LSI Logic SAS——LSI 逻辑串口
运维·服务器
C_心欲无痕1 小时前
网络相关 - Fetch 与 Ajax 请求讲解
前端·网络协议·ajax·fetch
天寒心亦热1 小时前
Ubuntu20.04系统WIFI网络监测及自动重启
linux·运维·服务器
源远流长jerry1 小时前
TCP 性能管理核心:滑动窗口、流量控制与拥塞控制机制解析
运维·服务器·网络
moonsims1 小时前
波士顿动力Auto-Connect-复杂环境下机器人连接解决方案
服务器·无人机
源远流长jerry1 小时前
TCP 可靠传输核心:MSS 分段、重传确认与 RTO 定时器解析
网络·网络协议·tcp/ip
骇客野人2 小时前
Java比较两个list,A中有但B中没有的元素
linux·服务器·windows
long跨境电商2 小时前
2026亚马逊新风口:自养号测评系统提前布局,店铺竞争力快人一步
大数据·服务器·安全
宠..2 小时前
奇怪的语法错误
运维·服务器·数据库·qt·microsoft