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

Sí 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 bash ejecutar HTTPSClient.class sigo teniendo:

  javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: construcción de rutas PKIX fallida: sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar una ruta de certificación válida para el destino solicitado 

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

  1. Descargue e instale portecle.
  2. Primero asegúrate al 100% de que sabes qué JRE o JDK se está utilizando para ejecutar tu progtwig. 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 en 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: cambiar
  7. Haz clic en Herramientas> Importar certificado de confianza
  8. Busque el archivo mycertificate.pem
  9. Haga clic en importar
  10. Haga clic en Aceptar para 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 solicita un alias, haga clic en Aceptar y vuelva a hacer clic en Aceptar cuando indique que ha importado el certificado.
  14. Clic en Guardar. No lo olvides o el cambio se descarta.
  15. Copia los cacerts de archivos donde los encontraste.

En Linux:

Puede descargar el certificado SSL de un servidor web que ya lo está usando 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 en el almacén de claves de cacerts de Java:

 $ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \ -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt 

Editar:

En estos días, no siempre tenemos que agregar un certificado al almacén de claves porque puede obtener un certificado por $ 5 por año en ssls.com . Por si acaso esa es una opción para ti.

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  /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 

“ `

  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" 

Esto funcionó para mí. 🙂

 sudo keytool -importcert -file nombre de archivo.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 

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 Windows Explorer y navegue hasta el archivo cacerts, que se encuentra en la subcarpeta jre \ lib \ security donde AX Core Client está instalado. La ubicación predeterminada es C: \ Archivos de progtwig \ ACL Software \ 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 necesite importar un certificado intermedio y / o certificado raíz en el archivo cacerts. Use la siguiente syntax 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 el mensaje “¿Confiar en este certificado?” Y presione Entrar.

Tal vez quieras probar

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

Honestamente, no tengo ni idea de dónde pone tu certificado si solo escribes cacerts simplemente dale una ruta completa

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

Si estás usando Cygwin aquí está el comando modificado que usé desde la parte inferior de la respuesta de “S.Botha”:

  1. asegúrese de identificar el JRE dentro del JDK que va a utilizar
  2. Inicie su prompt / cygwin como administrador
  3. ir dentro del directorio bin de ese JDK, por ejemplo, cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Ejecute el comando keytool desde adentro, donde usted proporciona la ruta a su nuevo certificado al final, como sigue:

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

Aviso, porque si esto está bajo Cygwin está dando una ruta a un progtwig que no es Cygwin, entonces la ruta es similar a DOS y entre comillas.