Как проверить имя сертификата и псевдоним в файлах хранилища ключей?
У меня есть несколько файлов .keystore, и мне нужно найти тот, в котором содержится конкретный CN и псевдоним. Можно ли сделать это с помощью keytool, jarsigner или какого-то другого инструмента? Я нашел способ проверить, использовался ли конкретный keystore для подписи определенного APK, но мне также нужно получить псевдоним и название сертификата в каждом из файлов.
5 ответ(ов)
Вы можете выполнить следующую команду, чтобы отобразить содержимое вашего файла хранилища ключей (keystore) и имена алиасов:
keytool -v -list -keystore /путь/к/вашему/keystore
Если вы ищете конкретный алиас (например, foo), вы можете указать его в команде:
keytool -list -keystore /путь/к/вашему/keystore -alias foo
Если алиас не найден, будет отображено сообщение об ошибке:
keytool error: java.lang.Exception: Alias does not exist
Таким образом, проверьте правильность введенного алиаса или наличие нужного алиаса в хранилище ключей.
Чтобы получить все детали, мне пришлось добавить опцию -v к ответу romaintaz:
keytool -v -list -keystore <FileName>.keystore
Вы можете выполнить следующий код на Java для работы с хранилищем ключей:
try {
File file = new File(keystoreLocation);
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 (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Класс Certificate содержит всю информацию о хранилище ключей.
UPDATE - ПОЛУЧЕНИЕ ЧАСТНОГО КЛЮЧА
Key key = keystore.getKey(alias, password.toCharArray());
String encodedKey = new Base64Encoder().encode(key.getEncoded());
System.out.println("key ? " + encodedKey);
@prateek Надеюсь, это то, что вы искали!
В среде, похожей на bash, вы можете использовать следующую команду:
keytool -list -v -keystore cacerts.jks | grep 'Alias name:' | grep -i foo
Эта команда состоит из трех частей. Как упоминалось выше, 1-я часть выводит все доверенные сертификаты со всеми деталями, и именно поэтому 2-я часть фильтрует только информацию об алиасах среди этих деталей. И, наконец, в 3-й части вы можете искать конкретный алиас (или его часть). Опция -i включает режим, не зависимый от регистра. Таким образом, данная команда вернет все алиасы, содержащие шаблон 'foo', например, foo, 123_FOO, fooBar и т.д. Для получения дополнительной информации смотрите man grep
.
Чтобы отобразить все сертификаты, используйте следующую команду:
keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"
Убедитесь, что вы указали правильный путь к вашему файлу cacerts
и что у вас есть необходимые права доступа для чтения этого keystore. Если требуется, вы также можете добавить флаг -storepass changeit
, чтобы указать стандартный пароль по умолчанию для keystore cacerts
.
Как исправить 'android.os.NetworkOnMainThreadException'?
Ошибка «Необходимо переопределить метод суперкласса» после импорта проекта в Eclipse
Использование контекста в фрагменте
Как заставить Android-устройство вибрировать с разной частотой?
Room - Директория экспорта схемы не указана аннотационному процессору, не удается экспортировать схему