java.security.InvalidKeyException: IOException : algid parse error, not a sequence

问题:读取私钥时报错:


KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyPEM));

错误原因 :

私钥格式错误,错误的privateKey是通过openssl生成的私钥,默认pkcs1格式(将文件中去掉私钥头-----BEGIN RSA PRIVATE KEY-----和私钥尾-----END RSA PRIVATE KEY-----得到),代码中的是用的PKC8格式解析私钥。

注:

PKCS8私钥文件是以-----BEGIN PRIVATE KEY-----开头

PKCS1私钥文件是以-----BEGIN RSA PRIVATE KEY-----开头


解决办法 :

一、对原有私钥进行格式转换

例如使用如下openssl命令生成的私钥文件格式为pkcs1

openssl genrsa -out private.key 2048

可使用如下openssl命令,将 PKCS1 格式的 private.key 文件转为PKCS8格式的新私钥文件 pkcs8Private.key

openssl pkcs8 -topk8 -inform PEM -in private.key -outform pem -nocrypt -out pkcs8Private.key

pkcs8转成pkcs1命令:

openssl pkcs8 -in pkcs8.pem -nocrypt -out pri_key.pem

 
二、直接生成PKC8格式的私钥

私钥生成命令

openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -out client.key

 
三、java采用BouncyCastle库中的PEMReader读取PEM格式的私钥

reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(keyBytes)));
PrivateKey key = (PrivateKey)reader.readObject();

bouncycastle库链接 http://www.bouncycastle.org/documentation.html

参考链接:java使用pem格式SSL证书请求https

https://blog.csdn.net/tuanyuanmian/article/details/88607621

解决办法主要参考来源:

https://stackoverflow.com/questions/6559272/algid-parse-error-not-a-sequence/46988448
 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心歌技术

打赏不能超过你的早餐钱!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值