El certificado es de confianza para PC pero no para Android

7 minutos de lectura

avatar de usuario
alexis

Desde esta mañana, mi certificado ya no es confiable en Android y luego mi aplicación ya no puede conectarse:

 Catch exception while startHandshake: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
 return an invalid session with invalid cipher suite of SSL_NULL_WITH_NULL_NULL
 javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
    at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:137)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
    at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:591)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:807)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:781)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:770)

Si pruebo en Google Chrome (en PC), no hay problema y el certificado es de confianza, pero si pruebo en el navegador Chrome en Android, me dice que el certificado no es de confianza. ¿Que puedo hacer?

  • ¿Se está comunicando con un servidor seguro, es decir (Https)?

    – Mohsin Naeem

    5 de julio de 2012 a las 8:16

  • sí, prueba el enlace, verás el certificado

    – alexis

    5 de julio de 2012 a las 8:19

avatar de usuario
Luceos

Es posible que le falte un certificado intermedio en su archivo de certificado. Si ya ha visitado otro sitio web que tiene el mismo vendedor de certificados, el certificado intermedio se recuerda en su navegador. Esto podría no ser así, o mejor aún, no será el caso con todos los visitantes de su sitio web. Para resolver la falta de un certificado intermedio en la conexión SSL, deberá agregar el certificado intermedio a su propio archivo de certificado.

GoDaddy tiene información sobre los certificados intermedios (pero la mejor fuente siempre es su proveedor de certificados):
http://support.godaddy.com/help/article/868/que-es-un-certificado-intermedio

Una vez tuve este problema de un certificado intermedio (también con Commodo) y tuve que combinar mi propio archivo de certificado con las CA intermedias para que funcionara. Una vez hecho, ya no se produjeron errores.

Instrucciones de instalación por servidor web de Godaddy: http://support.godaddy.com/help/article/5346/installing-an-ssl-server-instructions?locale=en

Y aquí hay una lista de las guías de instalación más comunes de Commodo:
https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/1145/0/how-do-i-make-my-own-bundle-file-from-crt-files

Según el servidor web que esté utilizando, deberá especificar todos los certificados (certificado de dominio, intermedio y raíz) o combinarlos en uno (por ejemplo, para Nginx) en el orden:

  1. certificado de dominio
  2. certificado intermedio
  3. certificado raíz

Una manera fácil de hacer esto en una terminal SSH es escribiendo:

cat domainfile intermediatefile rootfile > targetfile

Herramienta de prueba de certificado

Si encuentra más problemas o no está seguro de si el certificado es correcto, pruebe una herramienta en línea para verificar su certificado SSL. Por ejemplo: networking4all.com/en/ssl+certificates/quickscan

Soporte SNI para Android 2.2 y versiones anteriores

Tenga en cuenta que Android 2.2 (y probablemente más antiguo) no es compatible con SNI, lo que permite que varios certificados SSL para diferentes nombres de host funcionen sin problemas en una sola dirección IP. Gracias a @technyquist por proporcionar esa información. Revise esta pregunta SO sobre SNI para obtener más información sobre este tema.

  • +1, esto funcionó para mi problema con los dispositivos 2.3.X, ya que parecen tener un problema con el orden de la verificación encadenada (soy bastante novato cuando se trata de certificados) y al tener este nuevo paquete con el orden correcto (mediante una combinación como sugirió @Luceos) funcionó a las mil maravillas. Gracias

    – Armando

    16 de enero de 2014 a las 17:06

  • De nada, también lo usamos regularmente. Sobre todo porque valida algo más que un certificado intermedio. Feliz de haber podido ser de ayuda.

    – Luceos

    23 de septiembre de 2014 a las 7:20

  • el link de comodo esta caido

    – gsin rostro

    30 de junio de 2015 a las 8:24

  • Gracias por la explicación. Tengo un certificado de Thawte y tuve que iniciar sesión en su sitio web, hacer clic en “Ver información del pedido”. El correo electrónico enviado contiene un enlace donde se puede descargar el certificado intermedio en “Certificados Adicionales”.

    – Guillaume Renoult

    23 de noviembre de 2015 a las 6:14

  • Esto funcionó para mi OpenMediaVault NAS y mi teléfono con Marshmallow. Edité el certificado en el servidor, agregué los certificados intermedios, lo guardé y reinicié la interfaz web, y Chrome en mi teléfono pasó de ser “emisor no confiable” a estar satisfecho con el certificado. ¡Gracias!

    – Doctor J

    8 de abril de 2016 a las 4:21

avatar de usuario
dallas

Tienes que crear un paquete crt, entonces estará bien. Recibirá tres archivos crt. ¡Úsalos todos! Si solo usó el dominio.crt, habrá una advertencia en Android pero no en la PC.

Estoy en nginx. Abrí nombre_dominio.crt y luego abrí positivesslca2.crt, seleccioné todo y copié hasta el final de nombre_dominio.crt. Luego abra AddTrustExternalCARoot.crt, cópielo al final de nombre_dominio.crt nuevamente. Luego instale el dominio_name.crt

funciona bien

  • Esta parece ser la solución que estoy buscando, pero todavía no funciona para mí. También estoy en nginx con un certificado de Godaddy. Godaddy tiene 3 certificados: dominio.crt, intermedio.crt y paquete.crt. ¿Sabes cuál es el orden correcto según tu respuesta? es decir, dominio > intermedio > paquete o dominio > paquete > intermedio? por alguna razón ninguno de los dos funciona para mí.

    – isapir

    6 de enero de 2014 a las 8:13

  • Aparentemente bundle.crt es el [intermediate.crt + root.crt] concatenados para que parezca ser el orden correcto. Pero todavía no puedo hacer que funcione. ¿Algunas ideas? Gracias.

    – isapir

    6 de enero de 2014 a las 9:18

  • No necesita la raíz, ya está incluida en el sistema operativo. Solo necesitas la cadena intermedia. El pedido debe ser tuyo + intermedio.

    – valentía

    20 de agosto de 2014 a las 10:49

Agregar esto aquí ya que podría ayudar a alguien. Estaba teniendo problemas con Android que mostraba la ventana emergente y el error de certificado no válido.

Tenemos un certificado de validación extendida de Comodo y recibimos el archivo zip que contenía 4 archivos:

  • AddTrustExternalCARoot.crt
  • COMODORSAAddTrustCA.crt
  • COMODORSAExtendedValidationSecureServerCA.crt
  • www_midominio_com.crt

Los concatené todos juntos en una línea así:

cat www_mydomain_com.crt COMODORSAExtendedValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >www.mydomain.com.ev-ssl-bundle.crt

Luego usé ese archivo de paquete como mi ssl_certificate_key en nginx. Eso es todo, funciona ahora.

Inspirado en esta esencia: https://gist.github.com/ipedrazas/6d6c31144636d586dcc3

  • He intentado todos los otros pasos sugeridos. Esto funcionó para mí. ¡Gracias!

    – ericbae

    12 de agosto de 2015 a las 0:01

  • Buen trabajo, estuve buscando en Google como loco y esto lo arregló.

    –Olafur Tryggvason

    17/09/2015 a las 17:13

  • Gracias, y si alguien más está usando Namecheap, asegúrese de que esté en este formato: cat *yourdomainname*.crt *yourdomainname*.ca-bundle > cert_chain.crt

    – Harry

    7 oct 2019 a las 11:36


Tuve el mismo problema y mi problema era que el dispositivo no tenía la fecha y la hora correctas. Una vez que arreglé que el certificado es de confianza.

Con Comodo PositiveSSL hemos recibido 4 archivos.

  • AddTrustExternalCARoot.crt
  • COMODORSAAddTrustCA.crt
  • COMODORSADomainValidationSecureServerCA.crt
  • nuestro_dominio.crt

Cuando seguíamos las instrucciones en el sitio de comodo, recibíamos un error de que a nuestro certificado le faltaba un archivo de certificado intermedio.

Básicamente la sintaxis es

cat our_domain.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt  AddTrustExternalCARoot.crt > domain-ssl_bundle.crt

avatar de usuario
somecallitblues

Recientemente me encontré con este problema con el certificado de Commodo que compré en ssls.com y tuve 3 archivos:

nombre-de-dominio.ca-paquete nombre-de-dominio.crt y nombre-de-dominio.p7b

Tuve que configurarlo en Nginx y este es el comando que ejecuté:

cat domain-name.ca-bundle domain-name.crt > commodo-ssl-bundle.crt

Luego usé commodo-ssl-bundle.crt dentro del archivo de configuración de Nginx y funciona de maravilla.

avatar de usuario
Adrián Onú

Tuve el mismo error porque no emití un certificado de Let’s Encrypt para el www.mi-dominio.com, solo para mi-dominio.com

Emitiendo también para el www. y configurar el host virtual para cargar certificados para www.mi-dominio.com antes de redirigir a https://mi-dominio.com Hizo el truco.

¿Ha sido útil esta solución?