Jak sprawdzić nazwę certyfikatu i alias w plikach magazynu kluczy?

410

Mam kilka plików .keystore i muszę znaleźć taki z określonym CN i aliasem. Czy można to zrobić za pomocą keytool, jarsignera lub innego narzędzia? Znalazłem sposób, aby sprawdzić, czy do podpisania określonego pliku APK użyto określonego magazynu kluczy, ale muszę również uzyskać alias i nazwę certyfikatu w każdym z plików.

Malthan
źródło

Odpowiedzi:

720

Możesz uruchomić następujące polecenie, aby wyświetlić listę zawartości pliku kluczy (i nazwy aliasu):

keytool -v -list -keystore .keystore

Jeśli szukasz określonego aliasu, możesz go również określić w poleceniu:

keytool -list -keystore .keystore -alias foo

Jeśli alias nie zostanie znaleziony, wyświetli się wyjątek:

błąd keytool: java.lang.Exception: Alias ​​nie istnieje

Romain Linsolas
źródło
1
Cześć. Czy mogę wyświetlić hasło aliasu klucza? Jeśli znam nazwę aliasu klucza i mam certyfikat magazynu kluczy oraz hasło do magazynu kluczy
Prateek,
11
@prateek Nie możesz. Nie ma większego sensu posiadanie magazynu kluczy lub haseł, jeśli można je wyświetlić za pomocą narzędzia wiersza polecenia.
Markiz Lorne
2
Możesz uruchomić następującą komendę, aby wyświetlić zawartość pliku magazynu kluczy: keytool -list -keystore .keystore Powyższa komenda nie podaje nazwy aliasu
Manmohan Soni
1
@ManmohanSoni Zaktualizowałem go, dodając argument -v, który ujawnia alias
Steven Mark Ford
10
Myślę, że /path/to/keystorezamiast .keystoreto byłoby bardziej czytelne dla czytelnika. W każdym razie jest to poprawna odpowiedź!
Andrea,
261

Aby uzyskać wszystkie szczegóły, musiałem dodać opcję -v do romaintaz odpowiedź:

keytool -v -list -keystore <FileName>.keystore
enkara
źródło
4
keytool -v -list -keystore <nazwa_pliku> .jks
piyush singh 18.08.16
1
keytool -v -list -keystore cacerts
Ankur Srivastava
2
„Jeśli -vopcja jest określona, ​​certyfikat jest drukowany w formacie czytelnym dla człowieka , z dodatkowymi informacjami, takimi jak właściciel, wystawca, numer seryjny i wszelkie rozszerzenia.” (patrz:
Omówienie
64

Możesz uruchomić z kodu 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();
            }
    }

Klasa certyfikatu przechowuje wszystkie informacje o magazynie kluczy.

AKTUALIZACJA - UZYSKAJ PRYWATNY KLUCZ

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

@prateek Mam nadzieję, że tego właśnie szukasz!

Renjith
źródło
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.NoSuchAlametermException; import java.util.Enumeration;
zakaz geoinżynierii
1
@Renjith hello Ten kod wyświetla wszystko oprócz hasła związanego z aliasem, Jak mogę to wyświetlić. Proszę, pomóżcie mi
Prateek,
@Renjith java.security.UnrecoverableKeyExceptionjest to wyjątek zgłaszany, gdy próbuję tego kodu. Chcę odzyskać hasło do aliasu
Prateek,
2
fragmentu kodu należy użyć we wspomnianej pętli while
Renjith,
1
Nie miałem klasy Base64Encoder. Czy możesz mi powiedzieć, który plik jar ma? czy jest to plik .java?
Jack
17

W środowisku typu bash możesz użyć:

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

To polecenie składa się z 3 części. Jak wspomniano powyżej, pierwsza część zawiera listę wszystkich zaufanych certyfikatów ze wszystkimi szczegółami i dlatego druga część przychodzi do filtrowania tylko informacji o aliasie wśród tych szczegółów. I wreszcie w trzeciej części możesz wyszukać określony alias (lub jego część). W -i Włącza tryb niewrażliwy na przypadek. Zatem podane polecenie zwróci wszystkie aliasy zawierające wzorzec „foo”, fe foo, 123_FOO, fooBar itp. Aby uzyskać więcej informacjiman grep .

Svetoslav
źródło
12

Spowoduje to wyświetlenie wszystkich certyfikatów:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
Spacerować
źródło
Spowoduje to wyświetlenie tylko certyfikatów przechowywanych w magazynie zaufania JDK, który jest podobny, ale służy do innego celu niż magazyn kluczy (o który pytano). Istnieje dobre rozróżnienie tutaj: http://stackoverflow.com/questions/17935619/what-is-difference-between-cacerts-and-keystore .
David Levy,