У меня есть программа Ruby, которая вычисляет координаты, где каждый узел в двоичном дереве следует рисовать здесь: http://hectorcorrea.com/Blog/Drawing-a-Binary-Tree-in-Ruby
Этот код использует очень простой алгоритм для вычисления координат и не является «эффективным по площади», но это хороший старт. Если вы хотите увидеть код «live», вы можете проверить его здесь: http://binarytree.heroku.com/
Часть кода первоначально со Склада В качестве примера для списка всех псевдонимов в базе ключей:
// 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
Если Вы не должны делать этого программно, но просто хотеть управлять своими ключами, то я использовал свободный инструмент KeyMan IBM в течение долгого времени теперь. Очень хороший для экспорта закрытого ключа в файл PFX (тогда можно легко использовать OpenSSL, чтобы управлять им, извлечь его, изменить pwds, и т.д.).
Ваш keystore, выберите запись с закрытым ключом, затем Файл-> Сохраняет в pkcs12 файл (*.pfx, обычно). Можно тогда просмотреть содержание с:
$ openssl pkcs12 - в mykeyfile.pfx - информация
В первую очередь, будьте осторожны! Вся Ваша безопасность зависит от 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 и произвести ее в нужном формате. Это сделало бы хорошую тему для последующего вопроса.