es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo solucionar el error “java.security.cert.CertPathValidatorException: Trust anchor for certification path not found” en Android.

Estoy tratando de consumir un servicio que está protegido por un certificado SSL. Para eso, hice esta implementación, pero arroja este error:

java.security.cert.CertPathValidatorException: No se encontró ancla de confianza para la ruta de certificación.

Tengo el certificado en el directorio Raw y es un archivo .pem.

Estoy tratando de identificar el error pero sin suerte, este es mi código fuente:

public OkHttpClient gereratSecureOkHttpClient(Context context) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException, KeyManagementException {
    OkHttpClient.Builder client = new OkHttpClient().newBuilder()
            .readTimeout(60, TimeUnit.SECONDS)
            .connectTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS);

    InputStream caInput = context.getResources().openRawResource(R.raw.movilexitopruebas2021);
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    keyStore.load(caInput, "Password".toCharArray());

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");
    keyManagerFactory.init(keyStore, "Password".toCharArray());

    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());

    return client
            .sslSocketFactory(sslContext.getSocketFactory())
            .build();
}

Ya lo invoco de esta manera:

Retrofit retrofit = null;
retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(gereratSecureOkHttpClient(context))
                        .build();
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error que estás recibiendo sugiere que el certificado SSL en cuestión no puede ser validado o confiable por el cliente. En tu implementación, estás cargando un certificado con formato PKCS12 desde el directorio de recursos en bruto e inicializando el SSLContext con él.

    Aquí tienes algunas cosas que puedes intentar:

    1. Asegúrate de que tu certificado sea válido y confiable por el cliente. Puedes probar esto accediendo al punto final del servicio en un navegador web y verificando la validez del certificado SSL utilizando las herramientas de seguridad del navegador. Si el certificado no puede ser confiable, contacta al emisor del certificado para obtener un certificado válido o considera usar un certificado autofirmado con fines de prueba.
    2. Verifica que el certificado que estás cargando desde el directorio de recursos en bruto tenga el formato correcto. Un archivo .pem no es lo mismo que un certificado con formato PKCS12. Asegúrate de que el certificado esté correctamente formateado y cargado en la instancia de KeyStore.

    3. Intenta inicializar el SSLContext con un TrustManager en lugar de un KeyManager. En tu caso, solo estás cargando el certificado del cliente, lo cual puede no ser suficiente para que un servidor valide al cliente. Considera cargar la cadena de certificados raíz desde el servidor y pasarla al SSLContext como un TrustManager.

    4. Verifica la cadena de certificados en busca de certificados intermedios o raíz que puedan estar faltando. El error “Trust anchor not found” puede ocurrir si falta un certificado intermedio o raíz en el almacén de confianza del cliente. Asegúrate de que todos los certificados necesarios estén cargados en la instancia de KeyStore.

    5. Intenta usar una biblioteca diferente de HttpClient. Algunas bibliotecas de HttpClient pueden manejar la validación de certificados SSL de manera diferente y es posible que no produzcan este error. Considera usar una biblioteca diferente si es posible.

    ¡Espero que estas sugerencias ayuden a resolver tu problema!

Comments are closed.