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

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


person Malthan    schedule 15.10.2012    source источник


Ответы (7)


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

keytool -v -list -keystore .keystore

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

keytool -list -keystore .keystore -alias foo

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

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

person Romain Linsolas    schedule 15.10.2012
comment
Привет, могу ли я отобразить пароль псевдонима ключа, если я знаю имя псевдонима ключа и имею сертификат хранилища ключей и пароль хранилища ключей - person Prateek; 22.08.2013
comment
@prateek Вы не можете. Не было бы особого смысла иметь хранилище ключей или пароли ключей, если бы вы могли просто отобразить их с помощью инструмента командной строки. - person user207421; 17.04.2015
comment
Вы можете запустить следующую команду, чтобы вывести список содержимого вашего файла хранилища ключей: keytool -list -keystore .keystore В приведенном выше сообщении не указано имя псевдонима. - person Manmohan Soni; 12.01.2018
comment
@ManmohanSoni Я обновил его, добавив аргумент -v, который показывает псевдоним - person Steven Mark Ford; 22.03.2018
comment
Думаю, читателю будет понятнее /path/to/keystore вместо .keystore. В любом случае это правильный ответ! - person Andrea; 11.07.2018
comment
Даже если мы не введем пароль, команда покажет содержимое (несмотря на установку пароля для файла хранилища ключей)! Почему??? - person VahidShir; 07.05.2019
comment
@VahidShir Он не показывает весь контент, если вы не укажете пароль. Только несекретные вещи. - person user207421; 09.09.2020

Чтобы получить все подробности, мне пришлось добавить параметр -v в ответ romaintaz:

keytool -v -list -keystore <FileName>.keystore
person enkara    schedule 17.04.2015
comment
keytool -v -list -keystore ‹FileName› .jks - person piyush singh; 18.08.2016
comment
keytool -v -list -keystore cacerts - person Ankur Srivastava; 27.01.2017
comment
Если указан параметр -v, сертификат печатается в удобочитаемом формате с дополнительной информацией, такой как владелец, эмитент, серийный номер и любые расширения. (см .: Справочник по инструментам Java SE, отображение данных команда, параметр -list) - person Eido95; 24.08.2017

Вы можете запускать из кода 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 Надеюсь, это то, что вы ищете!

person Renjith    schedule 15.10.2012
comment
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; - person ban-geoengineering; 06.08.2013
comment
@Renjith hello Этот код отображает все, кроме пароля, связанного с псевдонимом. Как я могу его отобразить. Помогите, пожалуйста - person Prateek; 22.08.2013
comment
@Renjith java.security.UnrecoverableKeyException это исключение, возникающее, когда я пробую этот код, на самом деле я хочу получить пароль псевдонима - person Prateek; 22.08.2013
comment
вы должны использовать фрагмент кода внутри вышеупомянутого цикла while - person Renjith; 22.08.2013
comment
У меня не было класса Base64Encoder. Подскажите, пожалуйста, какой у него jar-файл? или это файл .java? - person Jack; 16.03.2016
comment
Итак, если я добавлю сертификат в хранилище ключей, я автоматически получу псевдоним? - person Gobliins; 05.04.2017
comment
Это спасло мне жизнь. Comodo в своей мудрости создал псевдоним, который отображался с? в середине. Как comodo id mycompany. Что ? Оказалось, что это какая-то цитата, которая не отображается на моей клавиатуре. Мне пришлось скопировать и вставить цитату из вывода java и использовать ее с keytool, чтобы сделать псевдоним более удобным. - person Fred Andrews; 30.12.2018

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

person Ycnannamela    schedule 18.02.2014
comment
Это близко к ответу только по ссылке. Политика заключается в том, что вы должны опубликовать некоторую информацию о том, как использовать инструмент / библиотеку в самом ответе. - person user202729; 10.12.2020

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

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

Эта команда состоит из 3-х частей. Как указано выше, в 1-й части будут перечислены все доверенные сертификаты со всеми подробностями, поэтому 2-я часть предназначена для фильтрации только информации о псевдонимах среди этих сведений. И, наконец, в третьей части вы можете искать конкретный псевдоним (или его часть). -i включает режим без учета регистра. Таким образом, данная команда выдаст все псевдонимы, содержащие шаблон 'foo', например. foo, 123_FOO, fooBar и т. д. Для получения дополнительной информации man grep.

person Svetoslav    schedule 01.11.2016

В нем будут перечислены все сертификаты:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
person Walk    schedule 19.03.2017
comment
Это будет только список сертификатов, хранящихся в хранилище доверенных сертификатов JDK, которое похоже на хранилище ключей, но для другой цели (о чем спрашивали). Здесь есть хорошее различие: http://stackoverflow.com/questions/17935619/what-is-difference-between-cacerts-and-keystore. - person David Levy; 19.03.2017
comment
Пароль: changeit (по умолчанию) - person Milrak Pereira Pessoa; 07.12.2020

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

https://dev.to/sfkulyk/writing-panel-manager-for-certificate-keystore-in-linux-shell-187b

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

person Saboteur    schedule 25.03.2021