java - opcion - keystore explorer manual
¿Cómo usar el archivo.key y.crt en java generado por openssl? (4)
Eche un vistazo a org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator
Necesito cifrado asimétrico en Java. Genero archivos .key y .crt con su propia contraseña y archivo .crt por openssl que se dice en http://www.imacat.idv.tw/tech/sslcerts.html .
¿Cómo usar estos archivos .key y .crt para extraer publickey y clave privada en Java?
Según tengo entendido, OpenSSL ha guardado archivos en el llamado formato PEM. Necesita convertirlo a formato Java Key Storage (JKS) y luego trabajar con ese formato (que es nativo de Java) para extraer archivos. Para la conversión, use esta consulta de Google , da muy buenos resultados.
Cargue el archivo JKS a la clase java.security.KeyStore. Luego use los métodos getCertificate y getKey para obtener la información necesaria.
Sus archivos .key
y .crt
pueden estar en formato PEM. Para comprobar esto, ábralos con un editor de texto y verifique si el contenido es ------BEGIN CERTIFICATE------
(o "begin RSA private key" ...). Este es generalmente el formato predeterminado utilizado por OpenSSL, a menos que haya especificado DER.
Probablemente no sea necesario (ver a continuación), pero si su certificado está en formato DER (un formato binario), puede convertirlos en formato PEM usando:
openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem
(Consulte la ayuda de openssl rsa
para hacer algo similar con la clave privada si es necesario).
Luego tienes dos opciones:
Crear un archivo PKCS # 12
openssl pkcs12 -export -in myhost.crt -inkey myhost.key -out myhost.p12
Puede usarlo directamente desde Java como un almacén de claves de tipo "PKCS12". La mayoría de las aplicaciones Java deberían permitirle especificar un tipo de almacén de claves además de la ubicación del archivo. Para las propiedades predeterminadas del sistema, esto se hace con javax.net.ssl.keyStoreType
(pero la aplicación que está utilizando podría no estar usando esto). De lo contrario, si quiere cargarlo explícitamente, use algo como esto:
KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis =
new FileInputStream("/path/to/myhost.p12");
ks.load(fis, "password".toCharArray()); // There are other ways to read the password.
fis.close();
(Entonces, debería poder iterar a través de los aliases()
de KeyStore
y usar getCertificate
(y luego getPublicKey()
para la clave pública) y getKey()
.
Use el PEMReader de
PEMReader
.FileReader fr = ... // Create a FileReader for myhost.crt PEMReader pemReader = new PEMReader(fr); X509Certificate cert = (X509Certificate)pemReader.readObject(); PublicKey pk = cert.getPublicKey(); // Close reader...
Para la clave privada, deberá implementar un PasswordFinder
(vea el enlace del documento PEMReader) para construir el PEMReader
si la clave privada está protegida con contraseña. (Necesitará convertir el resultado de readObject()
en una Key
o Key
PrivateKey
).
Esto debería hacer lo que quiera hacer (usando BouncyCastle PEMReader como se sugirió anteriormente): tome un certificado de clave privada + PEC codificada y envíe un archivo PKCS # 12. Utiliza la misma contraseña para el PKCS12 que se usó para proteger la clave privada.
public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception {
// Get the private key
FileReader reader = new FileReader(keyFile);
PEMReader pem = new PEMReader(reader, new PasswordFinder() {
@Override public char[] getPassword() {
return password.toCharArray();
}
});
PrivateKey key = ((KeyPair)pem.readObject()).getPrivate();
pem.close();
reader.close();
// Get the certificate
reader = new FileReader(cerFile);
pem = new PEMReader(reader);
X509Certificate cert = (X509Certificate)pem.readObject();
pem.close();
reader.close();
// Put them into a PKCS12 keystore and write it to a byte[]
ByteArrayOutputStream bos = new ByteArrayOutputStream();
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(null);
ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new java.security.cert.Certificate[]{cert});
ks.store(bos, password.toCharArray());
bos.close();
return bos.toByteArray();
}