Як перевірити ім'я та псевдонім сертифіката у файлах зберігання ключів?


410

У мене є маса файлів .keystore і мені потрібно знайти один із конкретними CN та псевдонімами. Чи є спосіб зробити це за допомогою інструмента за допомогою клавіш, jarsigner чи іншого інструменту? Я знайшов спосіб перевірити, чи використовується специфічна сховище ключів для підписання конкретного apk, але мені також потрібно отримати псевдонім та ім'я сертифіката у кожному з файлів.

Відповіді:


720

Ви можете запустити таку команду, щоб перерахувати вміст файлу зберігання ключів (і псевдонім ім'я):

keytool -v -list -keystore .keystore

Якщо ви шукаєте певний псевдонім, ви також можете вказати його в команді:

keytool -list -keystore .keystore -alias foo

Якщо псевдонім не знайдено, він відобразить виняток:

помилка keytool: java.lang.Exception: Псевдонім не існує


1
Привіт, я можу відобразити пароль псевдоніма ключа Якщо я знаю ім'я псевдоніма ключа та маю сертифікат
зберігання ключа

11
@prateek Ви не можете. Немало б сенсу мати паролі для зберігання ключів або паролі для ключів, якби ви могли просто відображати їх за допомогою інструменту командного рядка.
Маркіз Лорн

2
Ви можете запустити таку команду, щоб перерахувати вміст файлу зберігання ключів: keytool -list -keystore .keystore Наведене вище повідомлення не містить прізвища псевдоніму
Manmohan Soni

1
@ManmohanSoni Я оновив його, щоб включити аргумент -v, який розкриває псевдонім
Стівен Марк Форд

10
Я думаю, що /path/to/keystoreзамість цього .keystoreбуло б зрозуміліше для читача. У будь-якому випадку це правильна відповідь!
Андреа

261

Щоб отримати всі деталі, мені довелося додати параметр -v до відповіді romaintaz:

keytool -v -list -keystore <FileName>.keystore

4
keytool -v -list -keystore <FileName> .jks
piyush singh

1
keytool -v -list -keystore cacerts
Ankur Srivastava

2
"Якщо -vопція вказана, сертифікат друкується у читаному для людини форматі з додатковою інформацією, такою як власник, емітент, серійний номер та будь-які розширення." (див .: Довідка щодо інструментів Java SE, команда відображення даних, опція
-list

64

Ви можете запустити з коду 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();
            }
    }

Клас сертифікатів містить всю інформацію про сховище ключів.

ОНОВЛЕННЯ - Отримайте приватний ключ

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

@prateek Сподіваюся, що це те, що ти шукаєш!


імпорт java.io.File; імпорт java.io.FileInputStream; імпорт java.io.FileNotFoundException; імпорт java.io.IOException; імпорт java.security.cert.Certificate; імпорт java.security.KeyStore; імпорт java.security.KeyStoreException; імпортувати java.security.NoSuchAlgorithmException; імпорт java.util.Enumeration;
заборона-геоінженерія

1
@ Renjith Привіт Цей код відображає все, крім пароля, пов’язаного з псевдонімом, як я можу його відобразити. Будь ласка, допоможіть мені
Prateek

@ Renjith java.security.UnrecoverableKeyExceptionце виняток, кинутий, коли я намагаюся дійсно цей код, я хочу отримати пароль псевдоніма
Prateek

2
вам слід використати фрагмент коду всередині вищезгаданого циклу while
Renjith

1
У мене не було класу Base64Encoder. Скажіть, будь ласка, який файл файлу банку? чи це файл .java?
Джек


17

У середовищі, схожому на баш, ви можете використовувати:

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

Ця команда складається з 3 частин. Як було сказано вище, у першій частині будуть перераховані всі довірені сертифікати з усіма деталями, і тому друга частина приходить до фільтрування лише інформації про псевдоніми серед цих даних. І, нарешті, у 3-й частині ви можете шукати певний псевдонім (або його частину). У -i перевертає регістронезавісім режим на. Таким чином, дана команда отримає всі псевдоніми, що містять шаблон 'foo', fe foo, 123_FOO, fooBar тощо. Для отримання додаткової інформації man grep.


12

У цьому списку будуть вказані всі сертифікати:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"

Це буде лише перелік сертифікатів, що зберігаються в довіреному магазині JDK, який схожий, але з іншою метою зберігає брелок (про що запитували). Тут є хороша диференціація: http://stackoverflow.com/questions/17935619/what-is-difference-bet between-cacerts-and-keystore .
Девід Леві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.