Estoy tratando de conectarme a una caja IIS6 que ejecuta un certificado SSL de 256 bits de godaddy, y recibo el error:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
He estado tratando de determinar qué podría estar causando eso, pero dibujando espacios en blanco en este momento.
Así es como me estoy conectando:
HttpsURLConnection conn;
conn = (HttpsURLConnection) (new URL(mURL)).openConnection();
conn.setConnectTimeout(20000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
String tempString = toString(conn.getInputStream());
fuente
Contrariamente a la respuesta aceptada , no necesita un administrador de confianza personalizado, ¡debe corregir la configuración de su servidor!
Me encontré con el mismo problema al conectarme a un servidor Apache con un certificado dynadot / alphassl instalado incorrectamente. Me estoy conectando usando HttpsUrlConnection (Java / Android), que estaba lanzando -
El problema real es una configuración incorrecta del servidor: pruébelo con http://www.digicert.com/help/ o similar, e incluso le indicará la solución:
"El certificado no está firmado por una autoridad de confianza (comprobando en el almacén raíz de Mozilla). Si compró el certificado de una autoridad de confianza, probablemente solo necesite instalar uno o más certificados intermedios . Póngase en contacto con su proveedor de certificados para obtener ayuda para hacerlo. plataforma de servidor ".
También puede consultar el certificado con openssl:
openssl s_client -debug -connect www.thedomaintocheck.com:443
Probablemente verás:
Verify return code: 21 (unable to verify the first certificate)
y, anteriormente en la salida:
La cadena de certificados solo contendrá 1 elemento (su certificado):
... pero debe hacer referencia a las autoridades de firma en una cadena a una en la que Android confíe (Verisign, GlobalSign, etc.):
Las instrucciones (y los certificados intermedios) para configurar su servidor generalmente son proporcionados por la autoridad que emitió su certificado, por ejemplo: http://www.alphassl.com/support/install-root-certificate.html
Después de instalar los certificados intermedios proporcionados por mi emisor de certificados, ahora no tengo errores al conectarme usando HttpsUrlConnection.
fuente
Puede confiar en un certificado particular en tiempo de ejecución.
Simplemente descárguelo del servidor, ingrese los activos y cárguelos de esta manera usando ssl-utils-android :
En el ejemplo anterior, usé
OkHttpClient
peroSSLContext
puedo usarlo con cualquier cliente en Java.Si usted tiene alguna pregunta no dude en preguntar. Soy el autor de esta pequeña biblioteca.
fuente
Actualización basada en la última documentación de Android (marzo de 2017):
Cuando obtienes este tipo de error:
El problema podría ser uno de los siguientes:
La solución es enseñar
HttpsURLConnection
a confiar en un conjunto específico de AC. ¿Cómo? por favor, compruebe https://developer.android.com/training/articles/security-ssl.html#CommonProblemsOtros usuarios que usan
AsyncHTTPClient
desde lacom.loopj.android:android-async-http
biblioteca, verifique Configurar AsyncHttpClient para usar HTTPS .fuente
Si usa la actualización, debe personalizar su OkHttpClient.
fuente
getUnsafeOkHttpClient()
en Kotlin: stackoverflow.com/a/60507560/2914140 .Respondiendo a una publicación muy antigua. Pero tal vez ayude a algunos novatos y si ninguno de los anteriores funciona.
Explicación: Sé que nadie quiere una explicación basura; Más bien la solución. Pero en una línea, está intentando acceder a un servicio desde su máquina local a una máquina remota que no confía en su máquina. Debe solicitar la confianza del servidor remoto.
Solución: la siguiente solución supone que se cumplen las siguientes condiciones
Pasos:
Necesita un archivo de extensión .keystore para registrar su aplicación. Si no sabe cómo crear un archivo .keystore; luego siga junto con la siguiente sección Crear archivo .keystore o salte a la siguiente sección Firmar archivo Apk
Crear archivo .keystore
Abra Android Studio. Haga clic en el menú superior Generar> Generar APK firmado. En la siguiente ventana haga clic en el nuevo ... Crear botón. En la nueva ventana, ingrese los datos en todos los campos. Recuerde que los dos campos de Contraseña que recomiendo deben tener la misma contraseña; no use una contraseña diferente; y también recuerde la ruta de guardar en la parte superior de la ruta del almacén de claves del campo superior . Después de ingresar todo el campo, haga clic en el botón Aceptar.
Sign Apk File
Ahora necesita crear una aplicación firmada con el archivo .keystore que acaba de crear. Sigue estos pasos
Choose existing...
botónKey store password
yKey password
campos. También ingrese el aliasbuild.gradle
archivos, debe seleccionarBuild Types
yFlavors
.Build Types
elegirrelease
del menú desplegablePara
Flavors
sin embargo, se depende de la configuración en elbuild.gradle
archivo. Eligestaging
de este campo. Utilicé la siguiente configuración enbuild.gradle
, puedes usar la misma que la mía, pero asegúrate de cambiar elapplicationId
nombre de tu paqueteHaga clic en las dos
Signature Versions
casillas inferiores y haga clic en elFinish
botón.Casi ahí:
Todo el trabajo duro está hecho, ahora el movimiento de la verdad. Para acceder al servidor de ensayo respaldado por proxy, debe realizar alguna configuración en sus dispositivos Android de prueba reales.
Configuración de proxy en dispositivo Android:
Modify network
Advanced options
si no puede ver elProxy Hostname
campoProxy Hostname
ingrese la IP del host o el nombre que desea conectar. Un servidor de ensayo típico se denominará comostg.api.mygoodcompany.com
9502
Save
botónUna última parada:
Recuerde que generamos el archivo apk firmado en la sección Firmar archivo APK . Ahora es el momento de instalar ese archivo APK.
adb install
name of the apk file
adb command not found
. Ingrese la ruta completa comoC:\Users\shah\AppData\Local\Android\sdk\platform-tools\adb.exe
install
name of the apk file
Espero que el problema pueda resolverse. Si no, por favor déjame un comentario.
Salam!
fuente
El mensaje de error que recibía era similar, pero la razón era que el certificado autofirmado había expirado. Cuando se intentó el cliente openssl, me dio la razón que se pasó por alto cuando revisé el cuadro de diálogo del certificado desde Firefox.
Entonces, en general, si el certificado está allí en el almacén de claves y es "VÁLIDO", este error se activará.
fuente
TrustManager
y usar un conjunto diferente de criterios. Pero fuera de la caja, con eso tienes que trabajar.Tuve el mismo problema al conectarme desde el cliente Android al servidor Kurento. El servidor Kurento usa certificados jks, así que tuve que convertir pem a él. Como entrada para la conversión, utilicé el archivo cert.pem y condujo a tales errores. Pero si usa fullchain.pem en lugar de cert.pem , todo está bien.
fuente
Use https://www.ssllabs.com/ssltest/ para probar un dominio.
La solución de Shihab Uddin en Kotlin.
fuente
Tuve el mismo problema que encontré fue que el archivo de certificado .crt que proporcioné falta un certificado intermedio. Entonces solicité todos los archivos .crt al administrador de mi servidor, luego los concateneé en orden inverso.
Ex. 1. Root.crt 2. Inter.crt 3. myCrt.crt
en windows ejecuté copia Inter.crt + Root.crt newCertificate.crt
(Aquí ignoré myCrt.crt)
Luego proporcioné el archivo newCertificate.crt en el código a través de inputstream. Trabajo hecho.
fuente
El error de anclaje de confianza puede suceder por muchas razones. Para mí era simplemente que estaba intentando acceder en
https://example.com/
lugar dehttps://www.example.com/
.Por lo tanto, es posible que desee verificar sus URL antes de comenzar a construir su propio Trust Manager (como lo hice).
fuente
En los teléfonos Gingerbread, siempre aparece este error:
Trust Anchor not found for Android SSL Connection
incluso si configuro para confiar en mi certificado.Aquí está el código que uso (en lenguaje Scala):
y aquí está el código de conexión:
Básicamente, configuré para confiar en mi certificado personalizado. Si eso falla, entonces deshabilito la seguridad. Esta no es la mejor opción, pero es la única opción que conozco con teléfonos viejos y con errores.
Este código de muestra se puede traducir fácilmente a Java.
fuente
En mi caso, esto sucedía después de la actualización a Android 8.0. El certificado autofirmado en el que Android estaba configurado confiaba usando el algoritmo de firma SHA1withRSA. Cambiar a un nuevo certificado, utilizando el algoritmo de firma SHA256withRSA solucionó el problema.
fuente
Sé que no necesita confiar en todos los certificados, pero en mi caso tuve problemas con algunos entornos de depuración donde teníamos certificados autofirmados y necesitaba una solución sucia.
Todo lo que tenía que hacer era cambiar la inicialización del
sslContext
donde
trustAllCerts
fue creado así:Espero que esto sea útil.
fuente
Hostname '192.168.0.16' was not verified
. Estoy probando mi webapi a través de mi depurador (IIS Express) localmente. ¿Algúna idea de cómo arreglar esto? Gracias :)He tenido un problema similar y he descartado por completo la estrategia de confiar en todas las fuentes.
Comparto aquí mi solución aplicada a una aplicación implementada en Kotlin
Primero recomendaría usar el siguiente sitio web para obtener información sobre el certificado y su validez
Si no aparece como 'Emisores aceptados' en el almacén de confianza predeterminado de Android , debemos obtener ese certificado e incorporarlo a la aplicación para crear un almacén de confianza personalizado
La solución ideal en mi caso fue crear un Trust Manager de alto nivel que combine la tienda de confianza predeterminada personalizada y la de Android
Aquí expone el código de alto nivel utilizado para configurar el OkHttpClient que utilizó con Retrofit.
De esta manera, podría comunicarme con el servidor con un certificado autofirmado y con otros servidores con un certificado emitido por una entidad de certificación de confianza.
Esto es todo, espero que pueda ayudar a alguien.
fuente
Sé que este es un artículo muy antiguo, pero me encontré con este artículo al tratar de resolver mis problemas de anclaje de confianza. He publicado cómo lo arreglé. Si ha preinstalado su CA raíz, debe agregar una configuración al manifiesto.
https://stackoverflow.com/a/60102517/114265
fuente
fuente
También me he enfrentado al mismo problema. Solo elimino hhtps a http, como
final public static String ROOT_URL = "https://example.com";
afinal public static String ROOT_URL = "http://example.com";
Finalmente, resolví este problema.
fuente