Lorsque vous essayez de lire une clé privée RSA à partir d'un fichier à l'aide de la méthode
public PrivateKey getPrivateKey()
throws NoSuchAlgorithmException,
InvalidKeySpecException, IOException {
final InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream("privatekey");
byte[] privKeyBytes = null;
try {
privKeyBytes = IOUtils.toByteArray(inputStream);
} catch (final IOException exception) {
LOGGER.error("", exception);
IOUtils.closeQuietly(inputStream);
}
LOGGER.debug("privKeyBytes: {}", privKeyBytes);
String BEGIN = "-----BEGIN RSA PRIVATE KEY-----";
String END = "-----END RSA PRIVATE KEY-----";
String str = new String(privKeyBytes);
if (str.contains(BEGIN) && str.contains(END)) {
str = str.substring(BEGIN.length(), str.lastIndexOf(END));
}
KeyFactory fac = KeyFactory.getInstance("RSA");
EncodedKeySpec privKeySpec =
new PKCS8EncodedKeySpec(Base64.decode(str.getBytes()));
return fac.generatePrivate(privKeySpec);
}
Je reçois l'exception
Java.security.spec.InvalidKeySpecException: Java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at Sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.Java:200) ~[na:1.6.0_23]
at Java.security.KeyFactory.generatePrivate(KeyFactory.Java:342) ~[na:1.6.0_23]
à l'appel de fac.generatePrivate (privKeySpec).
Que signifie cette erreur?
Merci
Dmitri
Cela signifie que votre clé n'est pas au format PKCS # 8. La chose la plus simple à faire est d'utiliser le openssl pkcs8 -topk8 <...other options...>
commande pour convertir une fois la clé. Vous pouvez également utiliser la classe PEMReader
de la API légère Bouncycastle .
J'avais ce même problème, et le format de la clé n'était PAS le problème réel.
Tout ce que j'avais à faire pour me débarrasser de cette exception était d'appeler
Java.security.Security.addProvider(
new org.bouncycastle.jce.provider.BouncyCastleProvider()
);
et tout a fonctionné
Vous devez créer votre fichier PCKS8 à partir de votre clé privée!
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -pubout -outform PEM -out public_key.pem
openssl pkcs8 -topk8 -inform PEM -in private.pem -out private_key.pem -nocrypt