103 votes

Erreur d'analyse d'Algid, pas une séquence

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]

lors de l'appel fac.generatePrivate(privKeySpec).

Que signifie cette erreur?

Merci

Dimitri

143voto

Dimitris Points 126

J'avais le 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é

95voto

GregS Points 16158

Cela signifie que votre clé n'est pas au format PKCS#8. La chose la plus simple à faire est d'utiliser la commande openssl pkcs8 -topk8 <...other options...> pour convertir la clé une fois. Vous pouvez également utiliser la PEMReader de l' API légère Bouncycastle .

75voto

Pasha Gharibi Points 566

Vous devez faire votre fichier PCKS8 à partir de votre clé privée !

private.pem => nom du fichier de clé privée

 openssl genrsa -out private.pem 1024

public_key.pem => nom du fichier de clé publique

 openssl rsa -in private.pem -pubout -outform PEM -out public_key.pem

private_key.pem => nom de la clé privée au format PCKS8 ! vous pouvez simplement lire ce format en java

 openssl pkcs8 -topk8 -inform PEM -in private.pem -out private_key.pem -nocrypt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X