Как я перечисляю / закрытые ключи экспорта от keystore?

У меня есть программа Ruby, которая вычисляет координаты, где каждый узел в двоичном дереве следует рисовать здесь: http://hectorcorrea.com/Blog/Drawing-a-Binary-Tree-in-Ruby

Этот код использует очень простой алгоритм для вычисления координат и не является «эффективным по площади», но это хороший старт. Если вы хотите увидеть код «live», вы можете проверить его здесь: http://binarytree.heroku.com/

58
задан ScArcher2 29 September 2008 в 19:07
поделиться

3 ответа

Часть кода первоначально со Склада В качестве примера для списка всех псевдонимов в базе ключей:

    // 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 придумал класс 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  <ul>
     *              <li> [0] Keystore filename.
     *              <li> [1] Keystore password.
     *              <li> [2] alias
     *              </ul>
     */
    static public void main(String[] args)
    throws Exception {
        if(args.length < 3) {
          throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias, <key password: default same tha
n keystore");
        }
        final String keystoreName = args[0];
        final String keystorePassword = args[1];
        final String alias = args[2];
        final String keyPassword = getKeyPassword(args,keystorePassword);
        KeyStore ks = KeyStore.getInstance("jks");
        ks.load(new FileInputStream(keystoreName), keystorePassword.toCharArray());
        Key key = ks.getKey(alias, keyPassword.toCharArray());
        String b64 = new BASE64Encoder().encode(key.getEncoded());
        System.out.println("-----BEGIN PRIVATE KEY-----");
        System.out.println(b64);
        System.out.println("-----END PRIVATE KEY-----");
    }
    private static String getKeyPassword(final String[] args, final String keystorePassword)
    {
       String keyPassword = keystorePassword; // default case
       if(args.length == 4) {
         keyPassword = args[3];
       }
       return keyPassword;
    }
}

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

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  <ul>
     *              <li> [0] Keystore filename.
     *              <li> [1] Keystore password.
     *              <li> [2] alias
     *              </ul>
     */
    static public void main(String[] args)
    throws Exception {
        if(args.length < 3) {
          throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias, <key password: default same tha
n keystore");
        }
        final String keystoreName = args[0];
        final String keystorePassword = args[1];
        final String alias = args[2];
        final String keyPassword = getKeyPassword(args,keystorePassword);
        KeyStore ks = KeyStore.getInstance("jks");
        ks.load(new FileInputStream(keystoreName), keystorePassword.toCharArray());
        Key key = ks.getKey(alias, keyPassword.toCharArray());
        //String b64 = new BASE64Encoder().encode(key.getEncoded());
        String b64 = new String(Base64.encodeBase64(key.getEncoded(),true));
        System.out.println("-----BEGIN PRIVATE KEY-----");
        System.out.println(b64);
        System.out.println("-----END PRIVATE KEY-----");
    }
    private static String getKeyPassword(final String[] args, final String keystorePassword)
    {
       String keyPassword = keystorePassword; // default case
       if(args.length == 4) {
         keyPassword = args[3];
       }
       return keyPassword;
    }
}

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

java -classpath .:commons-codec-1.4/commons-codec-1.4.jar DumpPrivateKey $HOME/.keystore changeit tomcat
31
ответ дан Glenn Bech 7 November 2019 в 15:12
поделиться

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

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

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

$ openssl pkcs12 - в mykeyfile.pfx - информация

6
ответ дан ArtOfWarfare 7 November 2019 в 15:12
поделиться

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

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

KeyStore keys = ...
char[] password = ...
Enumeration<String> 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 и произвести ее в нужном формате. Это сделало бы хорошую тему для последующего вопроса.

3
ответ дан erickson 7 November 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: