Estoy haciendo una publicación https y obtengo una excepción de la excepción ssl Certificado de servidor no confiable. Si hago http normal, está funcionando perfectamente bien. ¿Tengo que aceptar el certificado del servidor de alguna manera?
101
Respuestas:
Estoy adivinando, pero si desea que se produzca un apretón de manos real, debe informar a Android de su certificado. Si desea aceptar pase lo que pase, utilice este pseudocódigo para obtener lo que necesita con el cliente HTTP Apache:
CustomSSLSocketFactory:
FullX509TrustManager es una clase que implementa javax.net.ssl.X509TrustManager, pero ninguno de los métodos realmente realiza ningún trabajo, obtenga una muestra aquí .
¡Buena suerte!
fuente
FullX509TrustManager
Esto es lo que estoy haciendo. Simplemente ya no verifica el certificado.
y
fuente
javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
. También intenté reemplazarTLS
conSSL
pero no ayudó. Por favor ayúdame, graciasMientras trataba de responder a esta pregunta, encontré un mejor tutorial. Con él, no tiene que comprometer la verificación del certificado.
http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
* No escribí esto pero gracias a Bob Lee por el trabajo.
fuente
También puedes mirar el artículo de mi blog, muy similar a crazybobs.
Esta solución tampoco compromete la verificación de certificados y explica cómo agregar los certificados confiables en su propio almacén de claves.
http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/
fuente
http://madurangasblogs.blogspot.in/2013/08/avoiding-javaxnetsslsslpeerunverifiedex.html
Cortesía de Maduranga
Al desarrollar una aplicación que usa https, su servidor de prueba no tiene un certificado SSL válido. O a veces, el sitio web utiliza un certificado autofirmado o el sitio web utiliza un certificado SSL gratuito. Entonces, si intenta conectarse al servidor usando Apache
HttpClient
, obtendrá una excepción que indica que el "par no autenticado". Aunque no es una buena práctica confiar en todos los certificados de un software de producción, es posible que deba hacerlo de acuerdo con la situación. Esta solución resuelve la excepción causada por "par no autenticado".Pero antes de ir a la solución, debo advertirle que esta no es una buena idea para una aplicación de producción. Esto violará el propósito de usar un certificado de seguridad. Entonces, a menos que tenga una buena razón o si está seguro de que esto no causará ningún problema, no use esta solución.
Normalmente creas un archivo
HttpClient
como este.HttpClient httpclient = new DefaultHttpClient();
Pero tienes que cambiar la forma en que creas el HttpClient.
Primero tienes que crear una clase que se extienda
org.apache.http.conn.ssl.SSLSocketFactory
.Luego crea un método como este.
Entonces puede crear el
HttpClient
.HttpClient httpclient = getNewHttpClient();
Si está intentando enviar una solicitud de publicación a una página de inicio de sesión, el resto del código sería así.
Obtienes la página html para InputStream. Entonces puede hacer lo que quiera con la página html devuelta.
Pero aquí te enfrentarás a un problema. Si desea gestionar una sesión mediante cookies, no podrá hacerlo con este método. Si desea obtener las cookies, deberá hacerlo a través de un navegador. Entonces solo recibirás cookies.
fuente
Si está utilizando un certificado StartSSL o Thawte, fallará para Froyo y versiones anteriores. Puede utilizar el repositorio CAcert de una versión más reciente en lugar de confiar en todos los certificados.
fuente
Ninguno de estos funcionó para mí (agravado por el error Thawte también). Finalmente lo solucioné con la aceptación de SSL autofirmado en Android y el manejo de SSL personalizado dejó de funcionar en Android 2.2 FroYo
fuente
Ninguna de estas respuestas me funcionó, así que aquí hay un código que confía en cualquier certificado.
fuente
No conozco las especificaciones de Android para los certificados ssl, pero tendría sentido que Android no acepte un certificado ssl autofirmado desde el principio. Encontré esta publicación en foros de Android que parece abordar el mismo problema: http://androidforums.com/android-applications/950-imap-self-signed-ssl-certificates.html
fuente
Este es un problema conocido con Android 2.x. Estuve luchando con este problema durante una semana hasta que me encontré con la siguiente pregunta, que no solo brinda un buen trasfondo del problema, sino que también brinda una solución funcional y efectiva sin agujeros de seguridad.
Error 'Sin certificado de pares' en Android 2.3 pero NO en 4
fuente
Por alguna razón, la solución mencionada para httpClient anteriormente no funcionó para mí. Al final, pude hacerlo funcionar anulando correctamente el método al implementar la clase SSLSocketFactory personalizada.
Así funcionó perfectamente para mí. Puede ver la clase personalizada completa y la implementación en el siguiente hilo: http://blog.syedgakbar.com/2012/07/21/android-https-and-not-trusted-server-certificate-error/
fuente
Hago esta clase y encontré
en tu codigo blanco esto
fuente
Fuentes que me ayudaron a trabajar con mi certificado autofirmado en mi servidor Apache de AWS y conectarme con HttpsURLConnection desde un dispositivo Android:
SSL en una instancia de AWS - tutorial de Amazon sobre SSL
Seguridad de Android con HTTPS y SSL - creando su propio administrador de confianza en el cliente para aceptar su certificado
Creación de un certificado autofirmado : secuencia de comandos sencilla para crear sus certificados
Luego hice lo siguiente:
create_my_certs.sh
:bash create_my_certs.sh yourdomain.com
Coloque los certificados en su lugar apropiado en el servidor (puede encontrar la configuración en /etc/httpd/conf.d/ssl.conf). Todos estos deben establecerse:
SSLCertificateFile
SSLCertificateKeyFile
SSLCertificateChainFile
SSLCACertificateFile
Reinicie httpd usando
sudo service httpd restart
y asegúrese de que httpd haya comenzado:Deteniendo httpd: [OK]
Iniciando httpd: [OK]
Copiar
my-private-root-ca.cert
a la carpeta de activos del proyecto de AndroidCrea tu administrador de confianza:
SSLContext SSLContext;
CertificateFactory cf = CertificateFactory.getInstance ("X.509"); InputStream caInput = context.getAssets (). Open ("mi-raíz-privada-ca.cert.pem"); Certificado ca; intente {ca = cf.generateCertificate (caInput); } finalmente {caInput.close (); }
Y haz la conexión usando HttpsURLConnection:
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection (); connection.setSSLSocketFactory (SSLContext.getSocketFactory ());
Eso es todo, prueba tu conexión https.
fuente
Probablemente puedas probar algo como esto. Esto me ayudó
fuente
Simplemente use este método como su HTTPClient:
fuente