Importación de cadena de certificado PEM y clave para Java Keystore

29

Hay muchos recursos sobre este tema, pero ninguno que encontré cubre este caso un poco especial.

Tengo 4 archivos;

  • privatekey.pem
  • certificado.pem
  • Intermedia_rapidssl.pem
  • ca_geotrust_global.pem

Y deseo importarlos a un nuevo almacén de claves.

Algunos sitios sugieren usar el formato DER e importarlos uno por uno, pero esto falló porque no se reconoce la clave.

Otro sitio sugirió una clase especial "ImportKey" para ejecutar para importación, y esto funcionó hasta que vi que la cadena está rota. Es decir, la longitud de la cadena en el certificado es 1, ignorando el intermedio y ca.

Algunos sitios sugieren PKCS7, pero ni siquiera puedo obtener una cadena de eso. Otros sugieren el formato PKCS12, pero en lo que respecta a mis pruebas, eso también falló para obtener toda la cadena.

Cualquier consejo o sugerencia son bienvenidos.

Trollbane
fuente

Respuestas:

26

Puede que esto no sea perfecto, pero tenía algunas notas sobre mi uso keytoolque he modificado para su escenario.

  1. Importe un certificado de CA raíz o intermedio a un almacén de claves Java existente:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. Combine el certificado y la clave privada en un archivo antes de importar.

    cat certificate.pem privatekey.pem > combined.pem
    

    Esto debería dar como resultado un archivo similar al siguiente formato.

    COMIENCE EL CERTIFICADO
    ...
    FINALICE
    EL CERTIFICADO COMIENCE LA CLAVE PRIVADA RSA
    ...
    FINALICE LA CLAVE PRIVADA RSA

  3. Importe un certificado primario firmado y una clave a un almacén de claves Java existente:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    
Aaron Copley
fuente
2
¿Qué versión de keytool te permite encadenar así? Esta sintaxis proporciona "error de herramienta clave: java.lang. Excepción: certificado no importado, el alias <root> ya existe" con -import y -importcert
ctpenrose
Difícil de decir, exactamente. Pero dado el año / mes, ¿es probable que sea Java 6? (No tengo idea de la versión menor). ¿Qué versión estás usando? El error dice que el problema podría estar en el almacén de claves. ( alias <root> already exists) ¿Puedes probar con un nuevo almacén de claves vacío?
Aaron Copley
1
Keytool no me permite importar un certificado utilizando un alias 'root' ya existente. Pero creo que fue un error tipográfico. Es interesante observar que keytool crea una cadena para su certificado cuando encuentra los certificados de los firmantes en el almacén de claves (bajo cualquier alias). La herramienta Java "Portecle" es útil para administrar el almacén de claves de Java.
Houtman
Keytool no funciona así, y no le permite importar un alias más de una vez como se describe. (Y sí, lo he intentado). Vea la respuesta de senajqerib a continuación para ver algo que funciona correctamente.
Steve Sether
1
Es una respuesta de tres años. Es completamente posible que las cosas hayan cambiado, pero le aseguro que funcionó (o estuvo cerca de funcionar, ya que indiqué que puede no ser perfecto) a partir de febrero de 2013. No dude en enviar una edición o marcarla para la atención del moderador.
Aaron Copley
42

Concatene todos los archivos * .pem en un archivo pem, como all.pem. Luego cree un almacén de claves en formato p12 con clave privada + all.pem

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

Luego exporta p12 a jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks
senanqerib
fuente
Gracias. Esta es la única respuesta completa y correcta. Como sugirió, es mucho más fácil concatenar los certificados en un solo archivo.
Steve Sether
¡Esto funcionó como un regalo para mí! Usé estas instrucciones para convertir una cadena de claves utilizadas en el repositorio de ejemplos de certificados autofirmados de nodejs para hablar con un servidor TLS basado en Java. ¡Un millón de gracias!
Galder Zamarreño
Esta es la respuesta correcta.
sfThomas
8

keytool no proporciona una forma de importar certificado + clave privada desde un único archivo (combinado), como se propuso anteriormente. Funciona bien, pero solo se importa el certificado, mientras que la clave privada se ignora. Puede verificarlo: su keytool -list -v -keystore yourkeystore.jkstipo de entrada de dominio es TrustedCertEntry, no PrivateKeyEntry.

Entonces, para resolver el problema inicial, primero se debe crear un almacén de claves PKCS # 12 usando openssl (o una herramienta similar), luego importar el almacén de claves con keytool -importkeystore.

Ixmal
fuente