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.

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


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

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!


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 .


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.