尝试读取SSLeay格式私钥时抛出InvalidKeyException。
请在下面找到详细信息: - 我有一个SSLeay格式私钥.pem格式以下面的文件
开头-----开始RSA私钥-----
我正在编写代码以获取以字节格式保存的私钥并将其转换为PrivateKey。 变量 privateKeyBytes 包含字节格式的私钥/
String pkStrFormat = new String(privateKeyBytes, "UTF-8");
pkStrFormat = pkStrFormat.replaceAll("(-----BEGIN RSA PRIVATE KEY-----\\r?\\n|-----END RSA PRIVATE KEY-----+\\r?\\n?)","");
byte[] keyBytesOfPrivateKey = org.bouncycastle.util.encoders.Base64
.decode(pkStrFormat.getBytes());
KeyFactory ecKeyFac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytesOfPrivateKey);
PrivateKey priKey = ecKeyFac.generatePrivate(keySpec);
我得到以下例外: -
Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:350)
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:356)
使用PKCS8格式密钥时,代码可以正常工作。
答案 0 :(得分:1)
以BEGIN RSA PRIVATE KEY
开头的PEM文件是PKCS#1,而不是PKCS#8。对于固定算法RSA,PKCS#1本质上是PKCS#8,因此删除了算法标识符。要像https://superuser.com/questions/606215/openssl-pkcs8-default-format-gives-rsa-private-key中那样转换您的密钥:
openssl pkcs8 -topk8 -inform pem -in file.key -outform pem -nocrypt -out file.pem
或使用与Bouncy Castle : PEMReader => PEMParser类似的PEMParser
(没有密码内容)