Comment vérifier le nom et l'alias du certificat dans les fichiers de clés?

410

J'ai un tas de fichiers .keystore et je dois en trouver un avec un CN et un alias spécifiques. Existe-t-il un moyen de le faire avec keytool, jarsigner ou un autre outil? J'ai trouvé un moyen de vérifier si un magasin de clés spécifique a été utilisé pour signer une apk spécifique, mais j'ai également besoin d'obtenir l'alias et le nom du certificat dans chacun des fichiers.

Malthan
la source

Réponses:

721

Vous pouvez exécuter la commande suivante pour répertorier le contenu de votre fichier de clés (et le nom d'alias):

keytool -v -list -keystore .keystore

Si vous recherchez un alias spécifique, vous pouvez également le spécifier dans la commande:

keytool -list -keystore .keystore -alias foo

Si l'alias n'est pas trouvé, il affichera une exception:

erreur keytool: java.lang.Exception: l'alias n'existe pas

Romain Linsolas
la source
1
Bonjour, puis-je afficher le mot de passe de l'alias de clé Si je connais le nom de l'alias de clé et que j'ai un certificat de magasin de clés et un mot de passe de magasin de clés
Prateek
11
@prateek Vous ne pouvez pas. Il ne serait pas très utile d'avoir un fichier de clés ou des mots de passe clés si vous pouviez simplement les afficher avec un outil en ligne de commande.
Marquis de Lorne
2
Vous pouvez exécuter la commande suivante pour répertorier le contenu de votre fichier de clés: keytool -list -keystore .keystore La commande ci-dessus ne fournit pas le nom d'alias
Manmohan Soni
1
@ManmohanSoni Je l'ai mis à jour pour inclure l'argument -v qui révèle l'alias
Steven Mark Ford
10
Je pense qu'au /path/to/keystorelieu d' .keystoreêtre plus clair pour le lecteur. Quoi qu'il en soit, c'est la bonne réponse!
Andrea
261

Afin d'obtenir tous les détails, j'ai dû ajouter l'option -v à la réponse de romaintaz:

keytool -v -list -keystore <FileName>.keystore
enkara
la source
4
keytool -v -list -keystore <FileName> .jks
piyush singh
1
keytool -v -list -keystore cacerts
Ankur Srivastava
2
"Si l' -voption est spécifiée, le certificat est imprimé dans un format lisible par l'homme , avec des informations supplémentaires telles que le propriétaire, l'émetteur, le numéro de série et toutes les extensions." (voir: Référence des outils Java SE, commande Afficher les données, option -list )
Eido95
64

Vous pouvez exécuter à partir du code Java.

try {

        File file = new File(keystore location);
        InputStream is = new FileInputStream(file);
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        String password = "password";
        keystore.load(is, password.toCharArray());


        Enumeration<String> enumeration = keystore.aliases();
        while(enumeration.hasMoreElements()) {
            String alias = enumeration.nextElement();
            System.out.println("alias name: " + alias);
            Certificate certificate = keystore.getCertificate(alias);
            System.out.println(certificate.toString());

        }

    } catch (java.security.cert.CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if(null != is)
            try {
                is.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

La classe de certificat contient toutes les informations sur le magasin de clés.

MISE À JOUR - OBTENIR UNE CLÉ PRIVÉE

Key key = keyStore.getKey(alias, password.toCharArray());
String encodedKey = new Base64Encoder().encode(key.getEncoded());
System.out.println("key ? " + encodedKey);

@prateek J'espère que c'est ce que vous cherchez!

Renjith
la source
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.security.cert.Certificate; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.Enumeration;
ban-geoengineering
1
@Renjith hello Ce code affiche tout sauf le mot de passe associé à l'alias, comment puis-je l'afficher. S'il vous plaît, aidez-moi
Prateek
@Renjith java.security.UnrecoverableKeyExceptionc'est l'exception levée lorsque j'essaie ce code. Je veux récupérer le mot de passe d'alias
Prateek
2
vous devez utiliser l'extrait de code à l'intérieur de la boucle while susmentionnée
Renjith
1
Je n'avais pas de classe Base64Encoder. Pouvez-vous me dire de quel fichier jar il s'agit? ou s'agit-il d'un fichier .java?
Jack
17

Dans un environnement de type bash, vous pouvez utiliser:

keytool -list -v -keystore cacerts.jks | grep 'Alias name:' | grep -i foo

Cette commande se compose de 3 parties. Comme indiqué ci-dessus, la 1ère partie listera tous les certificats de confiance avec tous les détails et c'est pourquoi la 2ème partie vient filtrer uniquement les informations d'alias parmi ces détails. Enfin, dans la 3e partie, vous pouvez rechercher un alias spécifique (ou une partie de celui-ci). L' option -i active le mode insensible à la casse. Ainsi, la commande donnée donnera tous les alias contenant le modèle 'foo', fe foo, 123_FOO, fooBar, etc. Pour plus d'informations man grep.

Svetoslav
la source
12

Cela répertoriera tous les certificats:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
Marcher
la source
Cela répertoriera uniquement les certificats stockés dans le magasin de clés de confiance du JDK, qui est similaire mais dans un but différent à un magasin de clés (qui a été interrogé). Il y a une bonne différenciation ici: http://stackoverflow.com/questions/17935619/what-is-difference-between-cacerts-and-keystore .
David Levy