Wie überprüfe ich den Zertifikatsnamen und den Alias ​​in Keystore-Dateien?

409

Ich habe eine Reihe von .keystore-Dateien und muss eine mit spezifischem CN und Alias ​​finden. Gibt es eine Möglichkeit, dies mit Keytool, Jarsigner oder einem anderen Tool zu tun? Ich habe eine Möglichkeit gefunden, zu überprüfen, ob ein bestimmter Keystore zum Signieren einer bestimmten Apk verwendet wurde, aber ich muss auch den Alias ​​und den Zertifikatsnamen in jeder der Dateien abrufen.

Malthan
quelle

Antworten:

719

Sie können den folgenden Befehl ausführen, um den Inhalt Ihrer Keystore-Datei (und den Aliasnamen) aufzulisten:

keytool -v -list -keystore .keystore

Wenn Sie nach einem bestimmten Alias ​​suchen, können Sie ihn auch im folgenden Befehl angeben:

keytool -list -keystore .keystore -alias foo

Wenn der Alias ​​nicht gefunden wird, wird eine Ausnahme angezeigt:

Keytool-Fehler: java.lang.Exception: Alias ​​existiert nicht

Romain Linsolas
quelle
1
Hallo, kann ich das Schlüssel-Alias-Passwort anzeigen? Wenn ich den Schlüssel-Alias-Namen kenne und ein Keystore-Zertifikat und ein Keystore-Passwort habe
Prateek
11
@prateek Du kannst nicht. Es wäre nicht sinnvoll, einen Keystore oder Schlüsselkennwörter zu haben, wenn Sie diese nur mit einem Befehlszeilentool anzeigen könnten.
Marquis von Lorne
2
Sie können den folgenden Befehl ausführen, um den Inhalt Ihrer Keystore-Datei aufzulisten: keytool -list -keystore .keystore Die obige Anweisung gibt nicht den Namen des Alias ​​an
Manmohan Soni
1
@ ManmohanSoni Ich habe es aktualisiert, um -v Argument aufzunehmen, das den Alias ​​enthüllt
Steven Mark Ford
10
Ich denke, dass /path/to/keystorestattdessen für .keystoreden Leser klarer wäre. Auf jeden Fall ist es die richtige Antwort!
Andrea
261

Um alle Details zu erhalten, musste ich die Option -v zur Antwort von romaintaz hinzufügen:

keytool -v -list -keystore <FileName>.keystore
Enkara
quelle
4
keytool -v -list -keystore <Dateiname> .jks
piyush singh
1
keytool -v -list -keystore cacerts
Ankur Srivastava
2
"Wenn die -vOption angegeben ist, wird das Zertifikat in einem für Menschen lesbaren Format mit zusätzlichen Informationen wie Eigentümer, Aussteller, Seriennummer und etwaigen Erweiterungen gedruckt ." (siehe: Java SE Tools Referenz, Befehl Daten anzeigen, Option -list )
Eido95
64

Sie können Java-Code ausführen.

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();
            }
    }

Die Zertifikatklasse enthält alle Informationen zum Schlüsselspeicher.

UPDATE - ERHALTEN SIE DEN PRIVATEN SCHLÜSSEL

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

@prateek Hoffe das ist was du suchst!

Renjith
quelle
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 hallo Dieser Code zeigt alles außer dem mit dem Alias ​​verknüpften Passwort an. Wie kann ich es anzeigen? Bitte helfen Sie mir
Prateek
@ Renjith java.security.UnrecoverableKeyExceptionDies ist die Ausnahme, die ausgelöst wird, wenn ich diesen Code tatsächlich versuche. Ich möchte das Alias-Passwort abrufen
Prateek
2
Sie sollten das Code-Snippet in der oben genannten while-Schleife verwenden
Renjith
1
Ich hatte keine Base64Encoder-Klasse. Können Sie mir bitte sagen, welche JAR-Datei es hat? oder ist es eine .java-Datei?
Jack
58

Open Source Visual Tool von KeyStore Explorer zum Verwalten von Keystores.

Ycnannamela
quelle
17

In einer Bash-ähnlichen Umgebung können Sie Folgendes verwenden:

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

Dieser Befehl besteht aus 3 Teilen. Wie oben erwähnt, listet der 1. Teil alle vertrauenswürdigen Zertifikate mit allen Details auf. Aus diesem Grund filtert der 2. Teil nur die Aliasinformationen unter diesen Details. Und schließlich können Sie im 3. Teil nach einem bestimmten Alias ​​(oder einem Teil davon) suchen. Das -i schaltet den Modus ohne Berücksichtigung der Groß- und Kleinschreibung ein. Somit gibt der angegebene Befehl alle Aliase aus, die das Muster 'foo', z. B. foo, 123_FOO, fooBar usw. enthalten. Weitere Informationen man grep.

Svetoslav
quelle
12

Dadurch werden alle Zertifikate aufgelistet:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
Gehen
quelle
Dadurch werden nur Zertifikate aufgelistet, die im Trust Store des JDK gespeichert sind. Dieser Zertifikat ähnelt einem anderen Schlüsselspeicher, wurde jedoch für einen anderen Zweck als der (nach dem gefragt wurde). Hier gibt es eine gute Unterscheidung: http://stackoverflow.com/questions/17935619/what-is-difference-between-cacerts-and-keystore .
David Levy