SSL: Android no puede verificar el nombre de host, definiendo suites de cifrado

6

Estoy desarrollando una aplicación para Android que envía algunas solicitudes HTTPS a nuestro propio servidor web (Linux, Nginx, SSL zertificate de "Let's Encrypt").

Las solicitudes funcionaron bien en mis dispositivos de prueba (Android 4.2.2 & Android 6.0.1), pero en otro dispositivo (5.1.1) la solicitud arrojó la Excepción:

  

No se puede verificar el nombre de host [mi_dominio]

Mirando el certificado en mi navegador, parece funcionar bien, usando la siguiente conexión:

  

TLS 1.2 AES_128_GCM ECDHE_RSA

Después de buscar ayuda en la web, finalmente intenté aplicar un SSLSocketFactory personalizado, que obliga al cliente a usar el Cipher Suite TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (que ha sido utilizado por Mis otros dispositivos de prueba, en los que funcionó la solicitud).

En pocas palabras: la solicitud luego funcionó en cualquier dispositivo, lo que indica que es culpa del cliente que la conexión no haya sido exitosa.

Así que ahora a mis preguntas:

  • ¿Por qué la verificación SSL funciona en algunos dispositivos Android, pero en otros no?

  • ¿Por qué la excepción dice que nombre de host no se pudo verificar , mientras que el certificado es válido y el nombre de host indicado en el certificado es el correcto?

  • ¿Es malo unir las solicitudes a un conjunto de cifrado específico? (Mirando esas listas , el conjunto de cifrado dado debe estar disponible en todos los necesarios Dispositivos Android (4.1.0 y superior))

Soy bastante nuevo en SSL y espero cualquier respuesta que pueda ayudarme a entender esto.

    
pregunta Florian Mötz 17.02.2016 - 22:39
fuente

2 respuestas

2
  • CA, que está firmando el certificado, no se encuentra en algunos almacenes de certificados de Android, por lo que no se valida. Vea de alguna manera cómo actualizarlo
  • el certificado se considera válido solo si se puede establecer una ruta de confianza completa (su_cert - > middle_CA1 - > middle_CA2 .. - > CA raíz) (puede haber 0 o más CA intermedias, pero la CA raíz debe estar presente en ese almacén de certificados de la versión de Android). Debe verificar si hay problemas en el lado del servidor (como no enviar certificados intermedios, por ejemplo) con ssllabs (apunte para "A "y no hay advertencias de color naranja / rojo) y / o htbridge . Tenga en cuenta que los dispositivos almacenan certificados intermedios en caché, por lo que su aplicación podría haber funcionado incluso sin haber cambiado el cifrado. O puede ser que el cifrado específico tenga errores en esa versión de Android.
  • es malo. Las recomendaciones cambian de vez en cuando, y no todas las personas actualizarán sus aplicaciones todo el tiempo. Deberías dejarlo a los automáticos. Si se desea la mejor seguridad de cifrado SSL, debe recomendarse / requerirse automáticamente en el lado del servidor , no en el cliente. También ayudaría con diferentes niveles de soporte existente dependiendo de las versiones de Android. En resumen: solo debe cambiar el orden de cifrado preferido en su servidor, y en la aplicación de Android use los valores predeterminados.
respondido por el Matija Nalis 18.02.2016 - 01:02
fuente
2

Algunos antecedentes sobre TLS (también conocido como SSL): cuando intenta establecer una conexión segura desde su cliente al servidor, el servidor enviará al cliente su certificado para demostrar su identidad al cliente, junto con una lista de los conjuntos de claves que apoya El cliente verifica la identidad asegurándose de que el dominio al que se está conectando sea el dominio indicado en el certificado, y que el certificado esté firmado por un autoridad de certificación . Una vez hecho esto, el cliente y el servidor establecen un secreto compartido del cual derivan las claves y también acuerdan un conjunto de cifrado.

Puede observar arriba que los conjuntos de cifrados (por ejemplo, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) se negocian después de que se establezca la identidad de los servidores. Esto significa que si hubiera un problema al verificar el nombre de host, ocurriría cuando el servidor le enviara al cliente su certificado, no cuando se negocien los conjuntos de cifrado. En otras palabras, este error no debe vincularse al conjunto de claves que el servidor y el cliente acuerdan, ya que ocurriría antes de que se acuerde un conjunto de cifrado.

Mi corazonada es que este puede ser un mensaje de excepción engañoso que le está dando la biblioteca SSL que se usa en Android. No estoy familiarizado con lo que los conjuntos de cifrado vienen con las bibliotecas SSL en Android 5 "fuera de la caja", por así decirlo, pero tal vez cuando el servidor envía al cliente su lista de cifrados admitidos, el cliente no ve ningún cifrado que admita y esto cae a alguna lógica de excepción engañosa. Yo sugeriría ver en qué conjuntos de claves está configurado su servidor para admitir y también consultar la documentación de Android 5 con respecto a los conjuntos de cifrados compatibles. Una cosa que parece ser cierta dado lo que dijo es que su certificado no es el problema aquí.

    
respondido por el puzzlepalace 18.02.2016 - 11:46
fuente

Lea otras preguntas en las etiquetas