Frage

Wie kann ich Liste und einen privaten Schlüssel aus einem Schlüsselspeicher exportieren?

War es hilfreich?

Lösung

Ein Teil des Codes aus Beispiel Depots ursprünglich für alle Aliase in einem Schlüsselspeicher-Eintrag:

    // 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);
    }

Der Export von privaten Schlüsseln kam auf dem Sun Foren ein paar Monaten, und u: turingcompleter mit einer DumpPrivateKey Klasse kam zum Aufnähen in Ihre App.

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;
    }
}

Hinweis: Diese Anwendung Sun-Paket, , die ein „bad Ding ".
Wenn Sie Apache Commons Code herunterladen können, hier ist eine Version, die ohne Warnung kompilieren:

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

und wird das gleiche Ergebnis:

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;
    }
}

Sie können es wie so verwenden:

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

Andere Tipps

Sie können einen privaten Schlüssel aus einem Schlüsselspeicher mit Java6 und OpenSSL extrahieren. Das alles hängt von der Tatsache, dass sowohl Java und OpenSSL Unterstützung PKCS # 12-Format Schlüsselspeicher. Um die Extraktion zu tun, nutzen zu können, keytool das Standardformat zu konvertieren. Stellen Sie sicher, dass Sie verwenden das gleiche Passwort für beide Dateien (Private Key-Passwort, nicht das Kennwort für Schlüsselspeicher) , oder Sie werden später im zweiten Schritt ungerade Ausfälle erhalten.

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

Als nächstes OpenSSL verwenden, um die Extraktion zu PEM zu tun:

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

Sie sollten in der Lage sein, diese PEM-Datei leicht genug zu handhaben; es ist Klartext mit einem codierten unverschlüsselten privaten Schlüssel und das Zertifikat (e) im Inneren (in einem ziemlich offensichtlich Format).

Wenn Sie dies tun, kümmern sich um die Dateien zu halten erstellt sicher. Sie enthalten geheime Zugangsdaten. Nichts wird Sie warnen, wenn Sie sich nicht, sie richtig zu sichern. Die einfachste Methode, um sie für die Sicherung ist all dies in einem Verzeichnis zu tun, die keine Zugriffsrechte für alle, hat außer den Benutzer. Und setzte niemals Ihr Passwort auf der Kommandozeile oder in Umgebungsvariablen; es ist zu einfach für andere Benutzer zu greifen.

Wenn Sie es nicht programmatisch tun müssen, sondern wollen einfach nur Ihre Schlüssel verwalten, dann habe ich jetzt IBMs kostenloses KeyMan Werkzeug für eine lange Zeit verwendet. Sehr schön, einen privaten Schlüssel in eine PFX-Datei für den Export (dann können Sie leicht OpenSSL verwenden, es zu manipulieren, entpacken Sie es, ändern Menschen mit Behinderung, etc).

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

Wählen Sie einen Schlüsselspeicher, wählen Sie den privaten Schlüssel Eintrag, dann File-> Save in eine PKCS12-Datei (* .pfx, in der Regel). Sie können dann den Inhalt sehen mit:

$ openssl pkcs12 -in mykeyfile.pfx -info

Hier ist eine kürzere Version des obigen Code in Groovy. Auch verfügt über eine integrierte in Base64-Codierung:

import java.security.Key
import java.security.KeyStore

if (args.length < 3)
        throw new IllegalArgumentException('Expected args: <Keystore file> <Keystore format> <Keystore password> <alias> <key password>')

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-----"

Für Android-Entwicklung, konvertieren Schlüsselspeicher erstellt in Eclipse ADT in öffentlichen Schlüssel und einen privaten Schlüssel verwendet in SignApk.jar:

Export private Schlüssel:

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

bearbeiten private.rsa.pem und verlassen "----- PRIVATE KEY ----- BEGIN" auf "----- END PRIVATE KEY -----" Absatz, dann:

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

Öffentliche Schlüssel exportieren:

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

Zeichen apk:

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

Diese Frage Sicherheit kam auf Stack, einen der Vorschläge war Schlüsselspeicher-Explorer verwenden

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

Nachdem es gerade versucht, es funktioniert wirklich gut und ich kann es sehr empfehlen.

Zunächst einmal seien Sie vorsichtig! Alle Ihre Sicherheit das hängt davon ab, ... äh ... Datenschutz Ihre private Schlüssel. Keytool in versehentliche Offenlegung dieses Material zu verhindern gebaut keine Schlüssel exportieren, so dass Sie vielleicht möchten einige zusätzliche Schutzmaßnahmen zu berücksichtigen, die dazu eingesetzt werden können, Ihre exportierten Schlüssel zu schützen.

Hier finden Sie einige einfache Code, den Sie unverschlüsselt PKCS # 8 PrivateKeyInfo gibt, die von OpenSSL verwendet werden können (siehe -nocrypt Möglichkeit, seine pkcs8 Dienstprogramm ):

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();
    }
  }
}

Wenn Sie andere Formate benötigen, können Sie eine KeyFactory verwenden, um eine transparente Schlüsselspezifikation für verschiedene Arten von Schlüsseln zu erhalten. Dann können Sie zum Beispiel der private Exponent eines privaten RSA-Schlüssel und Ausgabe, die es in das gewünschte Format. Das wäre für eine Folgefrage ein gutes Thema machen.

Ein weiteres großartiges Werkzeug ist Keystor Explorer: http://keystore-explorer.sourceforge.net/

Ein anderer, weniger konventioneller aber wohl einfacher Weg, dies zu tun, ist mit JXplorer . Obwohl dieses Tool durchsuchen LDAP-Verzeichnisse konzipiert ist, hat es eine einfach zu bedienende GUI für Schlüsselspeicher zu manipulieren. Eine solche Funktion auf dem GUI private Schlüssel von einem JKS Schlüsselspeicher exportieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top