Error al importar el certificado SSL: no es un certificado X.509

7 minutos de lectura

avatar de usuario de nikel
niquel

Estoy tratando de actualizar el certificado SSL de acuerdo con esta publicación
.

Soy novato en certificados, así que seguí esta guía. Pero, cuando entro

keytool -keystore mycacerts -storepass changeit -importcert -file "C:\Users\Noks\Desktop\cacerts.pem" -v

me sale el error:

keytool error: java.lang.Exception: Input not an X.509 certificate
java.lang.Exception: Input not an X.509 certificate
        at sun.security.tools.KeyTool.addTrustedCert(KeyTool.java:1913)
        at sun.security.tools.KeyTool.doCommands(KeyTool.java:818)
        at sun.security.tools.KeyTool.run(KeyTool.java:172)
        at sun.security.tools.KeyTool.main(KeyTool.java:166)

¿Cómo puedo solucionar esto?

  • Creo que ese comando funciona absolutamente bien en Java 1.6 o superior

    – Chaitanya Gudala

    27/10/2014 a las 15:29

Avatar de usuario de Bruno Grieder
bruno grieder

¿Su archivo cacerts.pem tiene un solo certificado? Ya que es un PEM, míralo (con un editor de texto), debería comenzar con

-----BEGIN CERTIFICATE-----

y terminar con

-----END CERTIFICATE-----

Finalmente, para comprobar que no está corrupto, hazte con openssl e imprime sus detalles usando

openssl x509 -in cacerts.pem -text

  • Bueno, tenía muchas de esas unidades, solo lo modifiqué para incluir una. Se instaló correctamente 🙂

    – Nikel

    27 de marzo de 2012 a las 13:33

  • ¿Acaba de agregar un CERTIFICADO DE INICIO y un CERTIFICADO DE FINALIZACIÓN entre todos los datos? También estoy enfrentando el mismo problema, ¿puedes ayudarme diciendo lo que hiciste?

    – Rengasami Ramanujam

    10 de mayo de 2012 a las 13:13

  • Las líneas ya deberían estar allí. Si no lo están, es probable que su certificado esté codificado en DER (o no sea válido). Para convertirlo hazlo openssl x509 -in mycert.der -inform DER -out myCert.pem -outform PEM. Para verlo y verificarlo openssl -in myCert.pem -text. El archivo debe contener un solo certificado.

    –Bruno Grieder

    10 mayo 2012 a las 14:19


  • El problema también puede ser que keytool puede ser un poco hipersensible a los espacios y finales de línea. Traté de importar el Vamos a cifrar certificado, y falló por eso, y arreglé el formato del certificado con openssl x509 -in broken.pem -out correct.pem y lo importo correct.pem sin problemas.

    – Stefan Seidel

    16 de marzo de 2016 a las 9:45

  • minúscula x509 es importante!

    – Deián

    1 jun 2019 a las 14:54

avatar de usuario de superlazy
supervago

Muchas CA proporcionarán un certificado en formato PKCS7.

De acuerdo a Documentación de Oracleel comando keytool puede manejar PKCS#7 pero a veces falla

El comando keytool puede importar certificados X.509 v1, v2 y v3, y cadenas de certificados con formato PKCS#7 que consisten en certificados de ese tipo. Los datos que se van a importar deben proporcionarse en formato de codificación binaria o en formato de codificación imprimible (también conocido como codificación Base64) según lo define el estándar Internet RFC 1421. En este último caso, la codificación debe estar delimitada al principio por una cadena que comience con —–BEGIN y al final por una cadena que comience con —–END.

Si el archivo PKCS7 no se puede importar, intente transformarlo de PKCS7 a X.509:

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

  • Lo que el documento no deja claro es que cuando -importcert a una entrada de clave privada existente, espera una ‘respuesta de certificado’, que puede ser un solo certificado o una cadena que incluya un PKCS7 usando CertificateFactory.generateCertificates (con s al final) pero cuando -importcert a una nueva entrada de certificado de confianza, espera solo un certificado y NO PKCS7 usando generateCertificate (sin s). Si desea confiar en varios certificados en una cadena (y el objetivo del encadenamiento es que no es necesario), debe importarlos individualmente a diferentes alias.

    – dave_thompson_085

    2 de febrero de 2019 a las 12:11

  • Yo también estaba enfrentando el problema de error de keytool: java.lang.Exception: la entrada no es un certificado X.509 Apliqué el comando anterior en mi certificado pkcs12 pero cambié -print_certs con -clcerts. Uno puede ver todos los comandos pkcs12 con openssl pkcs12 -help. el comando es: openssl pkcs12 -clcerts -in certfile.p12 -out newcertfile.cer ingrese la contraseña del certificado p12 y luego la frase de contraseña para PEM. Nota: copié el certificado p12 en otro lugar y luego generé .cer a partir de eso para evitar cualquier riesgo para el certificado original.

    – Noor Kan

    27 de noviembre de 2021 a las 3:10

Avatar de usuario de XDanny322
XDanny322

Esto parece un hilo viejo, pero agregaré mi experiencia aquí. También intenté instalar un certificado y obtuve ese error. Luego abrí el archivo cer con un editor de texto y noté que hay un espacio adicional (carácter) al final de cada línea. Eliminar esas líneas me permitió importar el certificado.

Espero que esto valga algo para alguien más.

  • Este fue el problema para mí también, creo que porque copié el texto del certificado directamente del correo electrónico del proveedor del certificado, dejó un espacio al final de cada línea.

    – Continuidad8

    10 de septiembre de 2017 a las 5:10

  • Jesucristo. Esto realmente me salvó. ¡Gracias!

    – Señor Derpington

    28 de abril de 2020 a las 15:27

  • Para hacer esto de la manera más fácil, si su editor de texto admite buscar/reemplazar con expresiones regulares (por ejemplo, como lo hace el Bloc de notas del programador), reemplace \s*[\r\n]+\s* con \n.

    – JohnLBevan

    19 de febrero de 2021 a las 9:36

Avatar de usuario de Mike Nakis
mike nakis

Como muestran las otras respuestas a esta pregunta, hay muchas causas posibles para este mensaje de error. La razón por la que te está pasando a ti puede ser totalmente diferente a la razón por la que me está pasando a mí. Y, desafortunadamente, el mensaje de error no señala en absoluto la fuente real del problema, por lo que es completamente inútil en la resolución de problemas. De hecho, es completamente engañoso.

Entonces, en lugar de brindarle una más de la miríada de posibles causas de este mensaje de error, lo que haré será mostrarle cómo solucionar este problema para descubrir qué lo está causando en su situación particular.

En el trabajo, comúnmente usamos los siguientes dos comandos para permitir que algún software se comunique con varios servidores, por ejemplo, para permitir que IntelliJ IDEA se comunique con nuestros repositorios maven internos:

[Elevated]keytool 
    -printcert -rfc -sslserver maven.services.{our-company}.com:443 > public.crt

[Elevated]keytool
    -import -storepass changeit -noprompt -trustcacerts -alias services.{our-company}.com 
    -keystore lib\security\cacerts -file public.crt

Ahora, lo que a veces sucede es que el keytool -printcert El comando no puede hacer su trabajo, ya sea debido a una configuración incorrecta o simplemente a problemas de conectividad temporales, como el firewall que lo impide, el usuario olvidó iniciar su VPN, lo que sea. Es un hecho de la vida que esto puede suceder. Este no es realmente el problema.

El problema es que cuando la estúpida herramienta encuentra tal error, no emite el mensaje de error al dispositivo de error estándar, ¡lo emite al dispositivo de salida estándar!

Así que esto es lo que termina sucediendo:

  • Cuando ejecuta el primer comando, no ve ningún mensaje de error, por lo que no tiene idea de que falló. Sin embargo, en lugar de una llave, el public.crt el archivo ahora contiene un mensaje de error que dice keytool error: java.lang.Exception: No certificate from the SSL server.
  • Cuando ejecuta el segundo comando, se lee public.crt y encuentra el texto del mensaje de error en lugar de una clave en él, por lo que falla, diciendo keytool error: java.lang.Exception: Input not an X.509 certificate.

La conclusión es: después keytool -printcert ... > public.crt volcar siempre el contenido de public.crt para asegurarse de que en realidad es una clave y no un mensaje de error antes de proceder a ejecutar keytool -import ... -file public.crt

Cambié 3 cosas y luego funciona:

  1. Hay una columna de espacios, los eliminé.
  2. Cambió el salto de línea de Windows CRLF a Linux LF
  3. Se eliminó la línea vacía al final.

Avatar de usuario de Pawel Zentala
Pawel Zentala

Tuve que eliminar espacios antes de la nueva línea después -----BEGIN CERTIFICATE-----.

¿Ha sido útil esta solución?