问题:读取私钥时报错:
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