Cómo exportar la clave privada a partir de un almacén de claves del certificado autofirmado

Acabo de crear un certificado auto-firmado en un cuadro de linux tomcat 6.

He creado las claves como este, válido por 10 años:

keytool -genkey -alias tomcatorange -keyalg RSA -validity 3650

y copian el almacén de claves dentro de la carpeta de tomcat, y actualizado server.xml al punto en el almacén de claves.

Ahora mi administrador de red está pidiendo el tanto de la parte pública y la clave privada ( para nuestro balanceador de carga)

Puedo generar la clave pública:

openssl s_client -connect mydomain.com:8443

Pero ¿cómo puedo exportar/recuperar la clave privada?

InformationsquelleAutor jeph perro | 2010-04-14

4 Kommentare

  1. 53

    Es un poco complicado. En primer lugar, puede utilizar keytool poner la clave privada en formato PKCS12, que es más portátil compatible de Java varios formatos de almacenes de claves. Aquí es un ejemplo tomando una clave privada con el alias de ‘mykey’ en Java keystore y copiarlo en un archivo PKCS12 nombre myp12file.p12.
    [nota de que en la mayoría de las pantallas de este comando se extiende más allá de la derecha de la caja: usted necesita para desplazarse hacia la derecha para ver todo]

    keytool -v -importkeystore -srckeystore .keystore -srcalias mykey -destkeystore myp12file.p12 -deststoretype PKCS12
    Enter destination keystore password:  
    Re-enter new password: 
    Enter source keystore password:  
    [Storing myp12file.p12]
    

    Ahora el archivo myp12file.p12 contiene la clave privada en formato PKCS12 que puede ser utilizado directamente por los muchos paquetes de software o procesan utilizando el openssl pkcs12 comando. Por ejemplo,

    openssl pkcs12 -in myp12file.p12 -nocerts -nodes
    Enter Import Password:
    MAC verified OK
    Bag Attributes
        friendlyName: mykey
        localKeyID: 54 69 6D 65 20 31 32 37 31 32 37 38 35 37 36 32 35 37 
    Key Attributes: <No Attributes>
    -----BEGIN RSA PRIVATE KEY-----
    MIIC...
    .
    .
    .
    -----END RSA PRIVATE KEY-----
    

    Imprime la clave privada de descifrado.

    Tenga en cuenta que este es un clave privada, y que son responsables para la apreciación de las implicaciones de seguridad de sacarlo de su Java keystore y de movernos.

    • El comando openssl anterior nos da el siguiente error: 6016:error:0D07207B:asn1 rutinas de codificación:ASN1_get_object:encabezado demasiado largo:.\crypto\asn1\asn1_lib.c:150:
    • Siento oir eso, pero a mí me funcionó. ¿Qué versión de openssl estás usando?
    • OMG gracias. Estado tomando el pelo durante tres días en el este. Sólo para descubrir que había estado utilizando mal la privada.clave. Yo era capaz de extraer de la privada.clave de la JKS y funciona. +10000 para usted.
    • Para todos los que conseguir el «Error de salida de claves y certificados» error: tratar de usar la misma contraseña para de origen y de destino.
    • En caso de que alguien más tiene el mismo problema que @user265330, trate de desplazamiento a la derecha en el cuadro de código en la respuesta e incluyendo la deststoretype parámetro. No es que me hizo esto, ni nada…
    • Ese es el problema que me estaba enfrentando. Gracias por señalándolo. Curioso, ¿cómo puedo verificar que la clave privada que me genera es la correcta para mi certificado?. En mi caso, he importado el PC7B formato de certificado de JKS y yo tenemos una clave en el comando de arriba. Lo que hace esta clave privada corresponden en mi caso?.
    • Puedo mover los argumentos de línea de comandos en torno a si usted piensa que podría ayudar. Yo también podría dividirlo en dos o más líneas, pero creo que se vería feo.

  2. 2

    http://anandsekar.github.io/exporting-the-private-key-from-a-jks-keystore/

    public class ExportPrivateKey {
            private File keystoreFile;
            private String keyStoreType;
            private char[] password;
            private String alias;
            private File exportedFile;
    
            public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {
                    try {
                            Key key=keystore.getKey(alias,password);
                            if(key instanceof PrivateKey) {
                                    Certificate cert=keystore.getCertificate(alias);
                                    PublicKey publicKey=cert.getPublicKey();
                                    return new KeyPair(publicKey,(PrivateKey)key);
                            }
                    } catch (UnrecoverableKeyException e) {
            } catch (NoSuchAlgorithmException e) {
            } catch (KeyStoreException e) {
            }
            return null;
            }
    
            public void export() throws Exception{
                    KeyStore keystore=KeyStore.getInstance(keyStoreType);
                    BASE64Encoder encoder=new BASE64Encoder();
                    keystore.load(new FileInputStream(keystoreFile),password);
                    KeyPair keyPair=getPrivateKey(keystore,alias,password);
                    PrivateKey privateKey=keyPair.getPrivate();
                    String encoded=encoder.encode(privateKey.getEncoded());
                    FileWriter fw=new FileWriter(exportedFile);
                    fw.write(“—–BEGIN PRIVATE KEY—–\n“);
                    fw.write(encoded);
                    fw.write(“\n“);
                    fw.write(“—–END PRIVATE KEY—–”);
                    fw.close();
            }
    
    
            public static void main(String args[]) throws Exception{
                    ExportPrivateKey export=new ExportPrivateKey();
                    export.keystoreFile=new File(args[0]);
                    export.keyStoreType=args[1];
                    export.password=args[2].toCharArray();
                    export.alias=args[3];
                    export.exportedFile=new File(args[4]);
                    export.export();
            }
    }
    
  3. -1

    public static void main(String[] args) {

    try {
            String keystorePass = "20174";
            String keyPass = "[email protected]";
            String alias = "TyaGi!";
            InputStream keystoreStream = new FileInputStream("D:/keyFile.jks");
            KeyStore keystore = KeyStore.getInstance("JCEKS");
            keystore.load(keystoreStream, keystorePass.toCharArray());
            Key key = keystore.getKey(alias, keyPass.toCharArray());
    
            byte[] bt = key.getEncoded();
            String s = new String(bt);
            System.out.println("------>"+s);      
            String str12 = Base64.encodeBase64String(bt);
    
            System.out.println("Fetched Key From JKS : " + str12);
    
        } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | UnrecoverableKeyException ex) {
            System.out.println(ex);
    
        }
    }
    

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea