Estoy tratando de hacer conexiones HTTPS, usando HttpClient
lib, pero el problema es que, dado que el certificado no está firmado por una Autoridad de certificación (CA) reconocida como Verisign , GlobalSIgn , etc., que figura en el conjunto de Certificados de confianza de Android, Sigo recibiendo javax.net.ssl.SSLException: Not trusted server certificate
.
He visto soluciones en las que simplemente acepta todos los certificados, pero ¿qué pasa si quiero preguntarle al usuario?
Quiero obtener un cuadro de diálogo similar al del navegador, permitiendo que el usuario decida continuar o no. Preferiblemente me gustaría usar el mismo almacén de certificados que el navegador. ¿Algunas ideas?
Respuestas:
Lo primero que debe hacer es establecer el nivel de verificación. Tales niveles no son tanto:
Aunque el método setHostnameVerifier () es obsoleto para la nueva biblioteca apache, pero para la versión en Android SDK es normal. Y así lo tomamos
ALLOW_ALL_HOSTNAME_VERIFIER
y lo configuramos en la fábrica de métodosSSLSocketFactory.setHostnameVerifier()
.A continuación, debe configurar nuestra fábrica para que el protocolo sea https. Para hacer esto, simplemente llame al
SchemeRegistry.register()
método.Entonces necesitas crear un
DefaultHttpClient
conSingleClientConnManager
. También en el código a continuación puede ver que, por defecto, también usará nuestra bandera (ALLOW_ALL_HOSTNAME_VERIFIER
) por el métodoHttpsURLConnection.setDefaultHostnameVerifier()
El siguiente código funciona para mí:
fuente
org.apache.http.conn.ssl.SSLSocketFactory
¿por qué quiero usarjavax.net.ssl.HttpsURLConnection
?Los siguientes pasos principales son necesarios para lograr una conexión segura de las Autoridades de certificación que la plataforma de Android no considera de confianza.
Como lo solicitaron muchos usuarios, he reflejado las partes más importantes de mi artículo de blog aquí:
java.net.ssl.HttpsURLConnection
(más fácil de entender, más eficiente)Agarra los certs
Debe obtener todos los certificados que crean una cadena desde el certificado de punto final hasta la CA raíz. Esto significa que cualquier certificado de CA intermedio (si está presente) y también el certificado de CA raíz. No necesita obtener el certificado de punto final.
Crea el almacén de claves
Descargue el proveedor BouncyCastle y guárdelo en una ubicación conocida. Asegúrese también de que puede invocar el comando keytool (generalmente ubicado debajo de la carpeta bin de su instalación de JRE).
Ahora importe los certificados obtenidos (no importe el certificado de punto final) en un almacén de claves con formato BouncyCastle.
No lo probé, pero creo que el orden de importación de los certificados es importante. Esto significa, primero importe el certificado de CA intermedio más bajo y luego hasta el certificado de CA raíz.
Con el siguiente comando , se creará un nuevo almacén de claves (si aún no está presente) con la contraseña mysecret y se importará el certificado CA intermedio. También definí el proveedor BouncyCastle, donde se puede encontrar en mi sistema de archivos y el formato del almacén de claves. Ejecute este comando para cada certificado en la cadena.
Verifique si los certificados se importaron correctamente en el almacén de claves:
Debería dar salida a toda la cadena:
Ahora puede copiar el almacén de claves como recurso sin procesar en su aplicación de Android en
res/raw/
Usa el almacén de claves en tu aplicación
En primer lugar, tenemos que crear un HttpClient de Apache personalizado que use nuestro almacén de claves para conexiones HTTPS:
Hemos creado nuestro HttpClient personalizado, ahora podemos usarlo para conexiones seguras. Por ejemplo, cuando hacemos una llamada GET a un recurso REST:
Eso es ;)
fuente
/res/raw/mykeystore.bks
, aunque no puedo resolver la referencia a él. ¿Cómo resolver esto?Si tiene un certificado personalizado / autofirmado en el servidor que no está en el dispositivo, puede usar la siguiente clase para cargarlo y usarlo en el lado del cliente en Android:
Coloque el
*.crt
archivo del certificado/res/raw
para que esté disponible enR.raw.*
Use la clase a continuación para obtener un
HTTPClient
oHttpsURLConnection
que tendrá una fábrica de sockets utilizando ese certificado:Puntos clave:
Certificate
Los objetos se generan a partir de.crt
archivos.KeyStore
crea un valor predeterminado .keyStore.setCertificateEntry("ca", cert)
está agregando un certificado al almacén de claves con el alias "ca". Modifica el código para agregar más certificados (CA intermedia, etc.).SSLSocketFactory
que luego puede ser utilizado porHTTPClient
oHttpsURLConnection
.SSLSocketFactory
se puede configurar más, por ejemplo, para omitir la verificación del nombre de host, etc.Más información en: http://developer.android.com/training/articles/security-ssl.html
fuente
.crt
archivos? ¿Descargar desde un servidor?Estaba frustrado al intentar conectar mi aplicación de Android a mi servicio RESTful usando https. También estaba un poco molesto por todas las respuestas que sugerían desactivar la verificación de certificados por completo. Si lo haces, ¿cuál es el punto de https?
Después de buscar en Google el tema por un tiempo, finalmente encontré esta solución donde no se necesitan frascos externos, solo API de Android. Gracias a Andrew Smith, quien lo publicó en julio de 2014.
Funcionó bien para mi aplicación de maqueta.
fuente
import java.security.cert.X509Certificate;
La respuesta principal no me funcionó. Después de investigar un poco, encontré la información requerida sobre "Desarrollador de Android": https://developer.android.com/training/articles/security-ssl.html#SelfSigned
Crear una implementación vacía de X509TrustManager hizo el truco:
¡Tenga en cuenta que esta implementación vacía de TustManager es solo un ejemplo y su uso en un entorno productivo podría causar una grave amenaza de seguridad!
fuente
Google recomienda el uso de Android Volley para conexiones HTTP / HTTPS , ya que
HttpClient
está en desuso. Entonces, sabes la elección correcta :).Y también, NUNCA NUKE Certificados SSL (NUNCA !!!).
Nukear los certificados SSL es totalmente contrario al propósito de SSL, que es promover la seguridad . No tiene sentido usar SSL, si planea bombardear todos los certificados SSL que vienen. Una mejor solución sería, no usar SSL, o una mejor solución, sería crear una aplicación personalizada
TrustManager
en su aplicación + usando Android Volley para conexiones HTTP / HTTPS.Aquí hay un Gist que creé, con una aplicación de inicio de sesión básica, que realiza conexiones HTTPS, usando un certificado autofirmado en el lado del servidor, aceptado en la aplicación.
Aquí también hay otro Gist que puede ayudar, para crear certificados SSL autofirmados para configurar en su servidor y también usar el certificado en su aplicación. Muy importante: debe copiar el archivo .crt que fue generado por la secuencia de comandos anterior, al directorio "en bruto" de su proyecto de Android.
fuente
Aquí le mostramos cómo puede agregar certificados adicionales a su KeyStore para evitar este problema: Confiar en todos los certificados usando HttpClient sobre HTTPS
No le preguntará al usuario como usted pregunta, pero hará que sea menos probable que el usuario se encuentre con un error de "Certificado de servidor no confiable".
fuente
La forma más sencilla de crear un certificado SSL
Abra Firefox (supongo que también es posible con Chrome, pero es más fácil para mí con FF)
Visite su sitio de desarrollo con un certificado SSL autofirmado.
Haga clic en el certificado (al lado del nombre del sitio)
Haga clic en "Más información"
Haga clic en "Ver certificado"
Haga clic en "Detalles"
Haga clic en "Exportar ..."
Elija "Certificado X.509 con cadena (PEM)", seleccione la carpeta y el nombre para guardarlo y haga clic en "Guardar"
Vaya a la línea de comando, al directorio donde descargó el archivo pem y ejecute "openssl x509 -inform PEM -outform DM -in .pem -out .crt"
Copie el archivo .crt en la raíz de la carpeta / sdcard dentro de su dispositivo Android Dentro de su dispositivo Android, Configuración> Seguridad> Instalar desde el almacenamiento.
Debería detectar el certificado y permitirle agregarlo al dispositivo. Navegue a su sitio de desarrollo.
La primera vez debería pedirle que confirme la excepción de seguridad. Eso es todo.
El certificado debería funcionar con cualquier navegador instalado en su Android (navegador, Chrome, Opera, Dolphin ...)
Recuerde que si está sirviendo sus archivos estáticos desde un dominio diferente (todos somos perras de velocidad de página) también debe agregar el certificado para ese dominio.
fuente
Escribí una pequeña biblioteca ssl-utils-android para confiar en un certificado particular en Android.
Simplemente puede cargar cualquier certificado dando el nombre del archivo desde el directorio de activos.
Uso:
fuente
Ninguna de estas soluciones funcionó para mi plataforma de desarrollo dirigida al SDK 16, versión 4.1.2, por lo que encontré una solución.
Mi aplicación almacena datos en el servidor usando " http://www.example.com/page.php?data=somedata "
Recientemente, page.php se movió a " https://www.secure-example.com/page.php " y sigo recibiendo "javax.net.ssl.SSLException: Certificado de servidor no confiable".
En lugar de aceptar todos los certificados para una sola página, comenzando con esta guía , resolví mi problema escribiendo mi propia página.php publicada en " http://www.example.com/page.php "
fuente
19 de enero de 2020 Certificado autofirmado PROBLEMA:
Para reproducir video, imagen, llamar al servicio web para obtener un certificado autofirmado o conectarse a una URL no segura, simplemente llame a este método antes de realizar cualquier acción, solucionará su problema relacionado con el problema del certificado:
CÓDIGO KOTLIN
fuente
Tal vez esto sea útil ... funciona en clientes Java utilizando certificados autofirmados (no hay verificación del certificado). ¡Tenga cuidado y úselo solo para casos de desarrollo porque eso no es seguro en absoluto!
Cómo ignorar los errores de certificado SSL en Apache HttpClient 4.0
Espero que funcione en Android solo agregando la biblioteca HttpClient ... ¡buena suerte!
fuente
Este es un problema resultante de la falta de compatibilidad con SNI (Identificación de nombre de servidor) en A, ndroid 2.x. Estuve luchando con este problema durante una semana hasta que me encontré con la siguiente pregunta, que no solo brinda un buen historial del problema, sino que también proporciona una solución eficaz y funcional sin ningún agujero de seguridad.
Error 'Sin certificado de igual' en Android 2.3 pero NO en 4
fuente