¿Cómo importar un certificado .cer en un keystore de java?

Durante el desarrollo de un cliente de servicios web Java, me encontré con un problema. La autenticación para el servicio web utiliza un certificado de cliente, un nombre de usuario y una contraseña. El certificado de cliente que recibí de la compañía detrás del servicio web está en formato .cer . Cuando inspecciono el archivo usando un editor de texto, tiene los siguientes contenidos:

 -----BEGIN CERTIFICATE----- [Some base64 encoded data] -----END CERTIFICATE----- 

Puedo importar este archivo como un certificado en Internet Explorer (¡sin tener que ingresar una contraseña!) Y usarlo para autenticarme con el servicio web.

Pude importar este certificado en un almacén de claves quitando primero la primera y la última línea, convirtiendo a líneas nuevas de Unix y ejecutando una deencoding base64. El archivo resultante se puede importar a un almacén de claves (usando el comando keytool ). Cuando enumero las entradas en el almacén de claves, esta entrada es del tipo trustedCertEntry . Debido a este tipo de entrada (?) No puedo usar este certificado para autenticarme con el servicio web. Estoy empezando a pensar que el certificado proporcionado es un certificado público que se está utilizando para la autenticación …

Una solución alternativa que he encontrado es importar el certificado en IE y exportarlo como un archivo .pfx . Este archivo se puede cargar como un almacén de claves y se puede usar para autenticarse con el servicio web. Sin embargo, no puedo esperar que mis clientes realicen estos pasos cada vez que reciben un nuevo certificado. Por lo tanto, me gustaría cargar el archivo .cer directamente en Java. ¿Alguna idea?

Información adicional: la compañía detrás del servicio web me dijo que el certificado debe ser solicitado (usando IE y el sitio web) desde la PC y el usuario que importaría el certificado más tarde.

  • Si quiere autenticarse, necesita la clave privada. No hay otra opción.
  • Un certificado es una clave pública con propiedades adicionales (como nombre de la empresa, país, …) firmada por alguna autoridad de certificación que garantiza que las propiedades adjuntas son verdaderas.
  • Los archivos .CER son certificados y no tienen la clave privada. La clave privada se proporciona normalmente con un archivo de almacén de claves .PFX. Si realmente se autentica es porque ya había importado la clave privada.
  • Normalmente puede importar certificados .CER sin ningún problema con

     keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

Importación del archivo de certificado .cer descargado del navegador (abra la url y excave para obtener más detalles) en cacerts keystore en java_home\jre\lib\security trabajado para mí, en contraposición a los bashs de generar y usar mi propio almacén de claves.

  1. Ve a tu java_home\jre\lib\security
  2. ( Windows ) Abre la línea de comandos de administración usando cmd y CTRL + MAYÚS + ENTRAR
  3. Ejecute keytool para importar el certificado:
    • (Reemplace yourAliasName y path\to\certificate.cer respectivamente)
  ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer 

De esta forma, no tiene que especificar ninguna opción de JVM adicional y el certificado debe ser reconocido por el JRE.

Aquí está el código que he estado usando para importar programáticamente archivos .cer en un nuevo KeyStore.

 import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; //VERY IMPORTANT. SOME OF THESE EXIST IN MORE THAN ONE PACKAGE! import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; //Put everything after here in your function. KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null);//Make an empty store InputStream fis = /* insert your file path here */; BufferedInputStream bis = new BufferedInputStream(fis); CertificateFactory cf = CertificateFactory.getInstance("X.509"); while (bis.available() > 0) { Certificate cert = cf.generateCertificate(bis); trustStore.setCertificateEntry("fiddler"+bis.available(), cert); } 

No debería tener que hacer ningún cambio en el certificado. ¿Estás seguro de que estás ejecutando el comando de importación correcto?

Lo siguiente funciona para mí:

 keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit 

donde mycert.cer contiene:

 -----BEGIN CERTIFICATE----- MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY ... RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc MMicbud3twMSO6Zbm3lx6CToNFzP -----END CERTIFICATE----- 

El certificado que ya tiene es probablemente el certificado del servidor o el certificado utilizado para firmar el certificado del servidor. Lo necesitará para que su cliente del servicio web pueda autenticar el servidor.

Pero si además necesita realizar autenticación de cliente con SSL, entonces necesita obtener su propio certificado para autenticar su cliente de servicio web. Para esto, necesita crear una solicitud de certificado; el proceso implica crear su propia clave privada y la clave pública correspondiente, y adjuntar esa clave pública junto con parte de su información (correo electrónico, nombre, nombre de dominio, etc.) a un archivo que se denomina solicitud de certificado. Luego, envíe esa solicitud de certificado a la compañía que ya se lo solicitó, y ellos crearán su certificado, al firmar su clave pública con su clave privada, y le enviarán un archivo X509 con su certificado, que usted puede enviar. ahora agregue a su almacén de claves, y estará listo para conectarse a un servicio web utilizando SSL que requiere la autenticación del cliente.

Para generar su solicitud de certificado, utilice “keytool -certreq -alias -file -keypass -keystore”. Envíe el archivo resultante a la compañía que lo firmará.

Cuando recupere su certificado, ejecute “keytool -importcert -alias -keypass -keystore”.

Es posible que necesite usar -storepass en ambos casos si el almacén de claves está protegido (lo cual es una buena idea).

Una herramienta de GUI de código abierto está disponible en keystore-explorer.org

Explorador de KeyStore

KeyStore Explorer es un reemplazo de GUI de código abierto para las herramientas de línea de comandos de Java keytool y jarsigner. KeyStore Explorer presenta su funcionalidad, y más, a través de una interfaz gráfica de usuario intuitiva.

Las siguientes pantallas ayudarán (son del sitio oficial)

Pantalla predeterminada que obtiene ejecutando el comando:

 shantha@shantha:~$./Downloads/kse-521/kse.sh 

enter image description here

Y vaya a Examine y Examine a URL opción de Examine a URL y luego proporcione la URL web que desea importar.

La ventana de resultados será similar a la siguiente si le da un enlace al sitio de google. enter image description here

Este es uno de los casos de uso y el rest depende del usuario (todos los créditos van a keystore-explorer.org )

Aquí hay un script que usé para importar por lotes un montón de archivos crt en el directorio actual en el almacén de claves de Java. Simplemente guarde esto en la misma carpeta que su certificado y ejecútelo de la siguiente manera:

 ./import_all_certs.sh 

import_all_certs.sh

 KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts"; function running_as_root() { if [ "$EUID" -ne 0 ] then echo "NO" exit fi echo "YES" } function import_certs_to_java_keystore { for crt in *.crt; do echo prepping $crt keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE echo done } if [ "$(running_as_root)" == "YES" ] then import_certs_to_java_keystore else echo "This script needs to be run as root!" fi 

Así es como esto funcionó para mí:

  1. Guarde como .txt los datos del certificado en el siguiente formato en un editor de texto

    —– BEGIN CERTIFICATE —– [data serialized by microsoft] —– END CERTIFICATE —–

  2. Abrir el navegador Chrome (este paso también podría funcionar con otros navegadores) configuración> mostrar configuraciones avanzadas> HTTPS / SSL> administrar certificados Importar el archivo .txt en el paso 1
  3. Seleccione y exporte ese certificado en formato codificado en Base 64. Guárdalo como .cer
  4. Ahora puede usar keytool o Portecle para importarlo a su keystore de Java