Как проверить имя сертификата и псевдоним в файлах хранилища ключей?

410

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

Malthan
источник

Ответы:

721

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

keytool -v -list -keystore .keystore

Если вы ищете конкретный псевдоним, вы также можете указать его в команде:

keytool -list -keystore .keystore -alias foo

Если псевдоним не найден, будет отображено исключение:

Ошибка keytool: java.lang.Exception: псевдоним не существует

Ромэн Линсолас
источник
1
Привет, могу ли я отобразить пароль псевдонима ключа? Если я знаю имя псевдонима ключа и у меня есть сертификат хранилища ключей и пароль хранилища ключей
Prateek,
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
enkara
источник
4
keytool -v -list -keystore <FileName> .jks
пиюш сингх
1
keytool -v -list -keystore cacerts
Анкур Шривастава
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 Надеюсь, это то, что вы ищете!

Renjith
источник
импорт java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; импорт java.io.IOException; import java.security.cert.Certificate; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; импорт java.util.Enumeration;
запрет геоинженерии
1
@Renjith hello Этот код отображает все, кроме пароля, связанного с псевдонимом. Как я могу его отобразить. Пожалуйста, помогите мне
Prateek
@Renjith java.security.UnrecoverableKeyException- это исключение, которое выдается, когда я пытаюсь выполнить этот код на самом деле, я хочу получить пароль псевдонима
Prateek
2
Вы должны использовать фрагмент кода внутри вышеупомянутого цикла while
Renjith
1
У меня не было класса Base64Encoder. Подскажите, пожалуйста, какой у него jar-файл? или это файл .java?
Джек,
58

KeyStore Explorer с открытым исходным кодом визуальный инструмент для управления хранилищами ключей.

Ycnannamela
источник
17

В среде, похожей на bash, вы можете использовать:

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

Эта команда состоит из 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-between-cacerts-and-keystore .
Дэвид Леви