¿Cómo importar correctamente un certificado autofirmado en el almacén de claves Java que está disponible para todas las aplicaciones Java de forma predeterminada?

144

Quiero importar un certificado autofirmado a Java para que cualquier aplicación Java que intente establecer una conexión SSL confíe en este certificado.

Hasta ahora, logré importarlo en

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

Aún así, cuando intento correr HTTPSClient.classsigo obteniendo:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: error en la construcción de la ruta PKIX: sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar la ruta de certificación válida para el objetivo solicitado
Sorin
fuente
No necesariamente confiaría en ese código. Cosas como Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())son completamente innecesarias en la primera parte. El segundo no hace ninguna verificación de cert. Intenta con una llanura URLConnectionpara empezar. ¿Seguro de que haya modificado cacertsen el lib/securityde la instalación de JRE? ¿Has probado la trustmanageropción de depuración ?
Bruno

Respuestas:

224

En Windows, la forma más fácil es usar el portecle del programa .

  1. Descargue e instale portecle.
  2. Primero asegúrese 100% de saber qué JRE o JDK se está utilizando para ejecutar su programa. En un Windows 7 de 64 bits, podría haber bastantes JRE. Process Explorer puede ayudarlo con esto o puede usar:System.out.println(System.getProperty("java.home"));
  3. Copie el archivo JAVA_HOME \ lib \ security \ cacerts a otra carpeta.
  4. En Portecle, haga clic en Archivo> Abrir archivo de almacén de claves
  5. Seleccione el archivo cacerts
  6. Ingrese esta contraseña: changeit
  7. Haga clic en Herramientas> Importar certificado de confianza
  8. Busque el archivo mycertificate.pem
  9. Haga clic en Importar
  10. Haga clic en Aceptar para ver la advertencia sobre la ruta de confianza.
  11. Haga clic en Aceptar cuando muestre los detalles sobre el certificado.
  12. Haga clic en Sí para aceptar el certificado como confiable.
  13. Cuando solicite un alias, haga clic en Aceptar y haga clic nuevamente en Aceptar cuando diga que ha importado el certificado.
  14. Clic en Guardar. No olvides esto o el cambio se descarta.
  15. Copia el archivo cacerts de nuevo donde lo encontraste.

En Linux:

Puede descargar el certificado SSL de un servidor web que ya lo está utilizando así:

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

Opcionalmente, verifique la información del certificado:

$ openssl x509 -in /tmp/examplecert.crt -text

Importe el certificado al almacén de claves de Java cacerts:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
Sarel Botha
fuente
1
La idea principal de esto no es portecle sino importar certificados en el almacén de claves correcto.
Alfabravo
Esto funcionó, pero mi Java estaba en una ubicación diferente. Mi almacén de claves estaba ubicado en / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts que encontré al ejecutar ps -ef | grep javaque me dijo que mi Java se estaba ejecutando desde openjdk ubicado en / usr / lib / jvm / java-openjdk / bin / java. Además, si esto es para una aplicación web, recuerde reiniciar. ¡¡Gracias por la ayuda!!
Codezilla
77
No he usado portecle, pero descubrí que Keystore Explorer funciona bastante bien para Windows, Linux (y debería funcionar también en OSX)
Xantix
Muy útil de hecho. 2 cosas muy importantes resaltadas aquí. Una se trata de importar en el almacén de claves correcto. Y otra es asegurarse de reiniciar en caso de un servidor web.
sdm
66
En 2019, incluso podemos obtener certificados SSL de forma gratuita utilizando servicios como Lets encrypt
Ferrybig
41
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"
Vikky
fuente
12
Se le pedirá la contraseña del almacén de claves, el valor predeterminado es "changeit"
The Gilbert Arenas Dagger
33

Terminé escribiendo un pequeño script que agrega los certificados a los almacenes de claves, por lo que es mucho más fácil de usar.

Puede obtener la última versión de https://github.com/ssbarnea/keytool-trust

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"

# /etc/java-6-sun/security/cacerts

for CACERTS in  /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

`` `

Sorin
fuente
"sudo keytool" NOPE
Dragas hace
17

Esto funcionó para mí. :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 
Caminar
fuente
4

Si está utilizando un certificado firmado por una Autoridad de certificación que no está incluido en el archivo de cacerts de Java de forma predeterminada, debe completar la siguiente configuración para las conexiones HTTPS. Para importar certificados en cacerts:

  1. Abra el Explorador de Windows y navegue hasta el archivo cacerts, que se encuentra en la subcarpeta jre \ lib \ security donde está instalado AX Core Client. La ubicación predeterminada es C: \ Archivos de programa \ Software ACL \ AX Core Client \ jre \ lib \ security
  2. Cree una copia de seguridad del archivo antes de realizar cambios.
  3. Dependiendo de los certificados que reciba de la Autoridad de certificación que esté utilizando, es posible que deba importar un certificado intermedio y / o certificado raíz en el archivo cacerts. Use la siguiente sintaxis para importar certificados: keytool -import -alias -keystore -trustcacerts -file
  4. Si está importando ambos certificados, el alias especificado para cada certificado debe ser único.
  5. Escriba la contraseña para el almacén de claves en el mensaje "Contraseña" y presione Entrar. La contraseña de Java predeterminada para el archivo cacerts es "changeit". Escriba "y" en "¿Confía en este certificado?" solicite y presione Entrar.
Bharat Darakh
fuente
Utilice este comando: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh
1

El comando simple 'keytool' también funciona en Windows y / o con Cygwin.

SI está utilizando Cygwin, aquí está el comando modificado que utilicé desde la parte inferior de la respuesta de "S.Botha":

  1. asegúrese de identificar el JRE dentro del JDK que usará
  2. Comience su prompt / cygwin como administrador
  3. vaya al directorio bin de ese JDK, por ejemplo, cd / cygdrive / c / Programme \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Ejecute el comando keytool desde su interior, donde proporciona la ruta a su nuevo Cert al final, de esta manera:

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"

Tenga en cuenta, porque si esto está bajo Cygwin, está dando una ruta a un programa que no es Cygwin, por lo que la ruta es similar a DOS y entre comillas.

Jordan Gee
fuente
0

Tal vez quiera probar

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

Honestamente, no tengo idea de dónde coloca su certificado si solo escribe, cacertsdéle una ruta completa

Degradado
fuente
0

instalar certificado en java linux

/ opt / jdk (versión) / bin / keytool -import -alias aliasname -file certificate.cer -keystore cacerts -storepass contraseña

Apuri Srikanth
fuente
0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
Hilal Aissani
fuente