Как перечислить / экспортировать закрытые ключи из хранилища ключей?

Как я могу перечислить и экспортировать закрытый ключ из хранилища ключей?

Часть кода из примера Depot для enums всех псевдонимов в хранилище ключей:

// Load input stream into keystore keystore.load(is, password.toCharArray()); // List the aliases Enumeration aliases = keystore.aliases(); for (; aliases.hasMoreElements(); ) { String alias = (String)aliases.nextElement(); // Does alias refer to a private key? boolean b = keystore.isKeyEntry(alias); // Does alias refer to a trusted certificate? b = keystore.isCertificateEntry(alias); } 

Экспорт закрытых ключей появился на форумах Sun пару месяцев назад, и u: turingcompleter придумал class DumpPrivateKey, чтобы вложить в ваше приложение.

 import java.io.FileInputStream; import java.security.Key; import java.security.KeyStore; import sun.misc.BASE64Encoder; public class DumpPrivateKey { /** * Provides the missing functionality of keytool * that Apache needs for SSLCertificateKeyFile. * * @param args 
    *
  • [0] Keystore filename. *
  • [1] Keystore password. *
  • [2] alias *
*/ static public void main(String[] args) throws Exception { if(args.length < 3) { throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias,

Примечание: это использование пакета Sun, что является «плохой вещью» .
Если вы можете скачать код сообщества apache , вот версия, которая будет компилироваться без предупреждения:

 javac -classpath .:commons-codec-1.4/commons-codec-1.4.jar DumpPrivateKey.java 

и даст тот же результат:

 import java.io.FileInputStream; import java.security.Key; import java.security.KeyStore; //import sun.misc.BASE64Encoder; import org.apache.commons.codec.binary.Base64; public class DumpPrivateKey { /** * Provides the missing functionality of keytool * that Apache needs for SSLCertificateKeyFile. * * @param args 
    *
  • [0] Keystore filename. *
  • [1] Keystore password. *
  • [2] alias *
*/ static public void main(String[] args) throws Exception { if(args.length < 3) { throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias,

Вы можете использовать его так:

 java -classpath .:commons-codec-1.4/commons-codec-1.4.jar DumpPrivateKey $HOME/.keystore changeit tomcat 

Вы можете извлечь закрытый ключ из хранилища ключей с Java6 и OpenSSL. Все это зависит от того, что как Java, так и OpenSSL поддерживают K-хранилища в формате PKCS # 12. Чтобы выполнить извлечение, сначала используйте keytool для преобразования в стандартный формат. Убедитесь, что вы используете один и тот же пароль для обоих файлов (пароль секретного ключа, а не пароль хранилища ключей), или позже вы получите нечетные сбои на втором этапе.

 keytool -importkeystore -srckeystore keystore.jks \ -destkeystore intermediate.p12 -deststoretype PKCS12 

Затем используйте OpenSSL, чтобы выполнить извлечение в PEM:

 openssl pkcs12 -in intermediate.p12 -out extracted.pem -nodes 

Вы должны иметь возможность обрабатывать этот файл PEM достаточно легко; это простой текст с закодированным незашифрованным закрытым ключом и сертификатом (ов) внутри него (в довольно очевидном формате).

Когда вы это сделаете, следите за тем, чтобы файлы были защищены. Они содержат секретные полномочия. Ничто не предупредит вас, если вы не сможете их правильно защитить. Самый простой способ их обеспечения – это сделать все это в каталоге, который не имеет прав доступа для кого-либо, кроме пользователя. И никогда не вводите свой пароль в командной строке или в переменных среды; это слишком легко для других пользователей.

Если вам не нужно делать это программно, а просто хотите управлять своими ключами, я давно использую бесплатный инструмент KeyMan от IBM. Очень приятно экспортировать закрытый ключ в файл PFX (тогда вы можете легко использовать OpenSSL, чтобы манипулировать им, извлекать его, изменять pwds и т. Д.).

https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=6fb00498-f6ea-4f65-bf0c-adc5bd0c5fcc

Выберите хранилище ключей, выберите запись личного ключа, затем Файл-> Сохранить в файл pkcs12 (обычно .pfx). Затем вы можете просмотреть содержимое с помощью:

$ openssl pkcs12 -in mykeyfile.pfx -info

Вот краткая версия вышеуказанного кода в Groovy. Также имеет встроенную кодировку base64:

 import java.security.Key import java.security.KeyStore if (args.length < 3) throw new IllegalArgumentException('Expected args:     ') def keystoreName = args[0] def keystoreFormat = args[1] def keystorePassword = args[2] def alias = args[3] def keyPassword = args[4] def keystore = KeyStore.getInstance(keystoreFormat) keystore.load(new FileInputStream(keystoreName), keystorePassword.toCharArray()) def key = keystore.getKey(alias, keyPassword.toCharArray()) println "-----BEGIN PRIVATE KEY-----" println key.getEncoded().encodeBase64() println "-----END PRIVATE KEY-----" 

Для разработки android для преобразования keystore, созданного в eclipse ADT, в открытый ключ и закрытый ключ, используемый в SignApk.jar:

экспортировать закрытый ключ:

 keytool.exe -importkeystore -srcstoretype JKS -srckeystore my-release-key.keystore -deststoretype PKCS12 -destkeystore keys.pk12.der openssl.exe pkcs12 -in keys.pk12.der -nodes -out private.rsa.pem 

отредактируйте private.rsa.pem и оставьте «—– НАЧАТЬ ЧАСТНЫЙ КЛЮЧ —–» на «—– END PRIVATE KEY —–», а затем:

 openssl.exe base64 -d -in private.rsa.pem -out private.rsa.der 

экспортный открытый ключ:

 keytool.exe -exportcert -keystore my-release-key.keystore -storepass  -alias alias_name -file public.x509.der 

знак apk:

 java -jar SignApk.jar public.x509.der private.rsa.der input.apk output.apk 

Этот вопрос возник из stackexchange security, одним из предложений было использование Keystore explorer

https://security.stackexchange.com/questions/3779/how-can-i-export-my-private-key-from-a-java-keytool-keystore

Просто попробовав, он работает очень хорошо, и я настоятельно рекомендую его.

Прежде всего, будьте осторожны! Вся ваша безопасность зависит от … конфиденциальности … ваших личных ключей. Keytool не имеет встроенного ключа экспорта, чтобы избежать случайного раскрытия этого чувствительного материала, поэтому вы можете рассмотреть некоторые дополнительные меры предосторожности, которые могут быть установлены для защиты ваших экспортированных ключей.

Вот простой код, который дает вам незашифрованный PKCS # 8 PrivateKeyInfo, который может использоваться OpenSSL (см. -nocrypt для его утилиты pkcs8 ):

 KeyStore keys = ... char[] password = ... Enumeration aliases = keys.aliases(); while (aliases.hasMoreElements()) { String alias = aliases.nextElement(); if (!keys.isKeyEntry(alias)) continue; Key key = keys.getKey(alias, password); if ((key instanceof PrivateKey) && "PKCS#8".equals(key.getFormat())) { /* Most PrivateKeys use this format, but check for safety. */ try (FileOutputStream os = new FileOutputStream(alias + ".key")) { os.write(key.getEncoded()); os.flush(); } } } 

Если вам нужны другие форматы, вы можете использовать KeyFactory для получения прозрачной спецификации ключа для разных типов ключей. Затем вы можете получить, например, частный экземпляр частного ключа RSA и вывести его в желаемом формате. Это станет хорошей темой для последующего вопроса.

Еще один отличный инструмент – KeyStore Explorer: http://keystore-explorer.sourceforge.net/

Другой менее традиционный, но, возможно, более простой способ сделать это – с JXplorer . Хотя этот инструмент предназначен для просмотра каталогов LDAP, он имеет простой в использовании графический интерфейс для управления хранилищами ключей. Одна из таких функций в графическом интерфейсе может экспортировать секретные ключи из хранилища ключей JKS.

  • Как создать сервер HTTPS в Node.js?
  • Java: загрузка SSL Keystore через ресурс
  • SSLHandshakeException Цепочный якорь для пути сертификации не найден Android HTTPS
  • Как отключить резерв SSL и использовать только TLS для исходящих подключений в .NET? (Смягчение пуделя)
  • Как указать список шифров SSL / TLS, предлагаемый конкретным сайтом?
  • По умолчанию SecurityProtocol в .NET 4.5
  • Thunderbird: Ошибка: imap.server.com: сервер не поддерживает RFC 5746, см. CVE-2009-3555
  • ASP.NET MVC RequireHttps только в производстве
  • Каков правильный способ безопасного отключения сокета SSL asio?
  • Включить SSL для моей службы WCF
  • Использование настраиваемого хранилища доверия в Java, а также значение по умолчанию
  • Давайте будем гением компьютера.