tomcat - marcada - Cómo exportar una clave privada desde un almacén de claves de un certificado autofirmado
exportar certificado con clave privada marcada como no exportable (4)
Acabo de crear un certificado autofirmado en una caja de Linux con Tomcat 6.
Creé las claves así, válidas por 10 años:
keytool -genkey -alias tomcatorange -keyalg RSA -validity 3650
y copió el almacén de claves en una carpeta en tomcat, y actualicé server.xml para que apunte al almacén de claves.
Ahora el administrador de mi red solicita la clave pública y la clave privada (para nuestro equilibrador de carga)
Puedo generar la clave pública usando:
openssl s_client -connect mydomain.com:8443
Pero, ¿cómo puedo exportar / recuperar la clave privada?
El uso de la GUI de Keystore Explorer - http://keystore-explorer.sourceforge.net/ - le permite extraer la clave privada de un .jks en varios formatos.
Es un poco complicado. Primero, puede usar keytool para poner la clave privada en formato PKCS12, que es más portátil / compatible que los diversos formatos de almacén de claves de Java. Este es un ejemplo que toma una clave privada con el alias ''mykey'' en un almacén de claves Java y la copia en un archivo PKCS12 llamado myp12file.p12
. [tenga en cuenta que en la mayoría de las pantallas, este comando se extiende más allá del lado derecho del cuadro: debe desplazarse hacia la derecha para verlo 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 utilizada directamente por muchos paquetes de software o procesada mediante el comando openssl pkcs12
. 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 sin cifrar.
Tenga en cuenta que esta es una clave privada y usted es responsable de apreciar las implicaciones de seguridad de eliminarla de su almacén de claves de Java y moverla.
public static void main (String [] args) {
try {
String keystorePass = "20174";
String keyPass = "rav@789";
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);
}
}
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();
}
}