respuesta - ¿Cómo importar un certificado.cer en un keystore de java?
keytool list certificates (8)
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 decodificación 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.
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);
}
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í:
- Guarde como .txt los datos del certificado en el siguiente formato en un editor de texto
----- BEGIN CERTIFICATE ----- [data serialized by microsoft] ----- END CERTIFICATE -----
- 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
- Seleccione y exporte ese certificado en formato codificado en Base 64. Guárdalo como .cer
- Ahora puede usar keytool o Portecle para importarlo a su keystore de Java
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).
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 intentos de generar y usar mi propio almacén de claves.
- Ve a tu
java_home/jre/lib/security
- ( Windows ) Abre la línea de comandos de administración usando
cmd
y CTRL + MAYÚS + ENTRAR - Ejecute keytool para importar el certificado:
- (Reemplace
yourAliasName
ypath/to/certificate.cer
respectivamente)
- (Reemplace
../../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.
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-----
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
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.
Este es uno de los casos de uso y el resto depende del usuario (todos los créditos van a keystore-explorer.org )
- 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"