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.

La verificación del certificado SSL se puede desactivar en Postman: ¿cómo se hace lo mismo en Retrofit (Android)?

En Postman, puedo hacer llamadas a una API que funcionen desactivando la verificación del certificado en las preferencias, ¿cómo puedo desactivarlo en Retrofit (solo para pruebas)?

Cuando intento usar el certificado apropiado, obtengo el error:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: No se encontró un ancla de confianza para la ruta de certificación.

Cuando intento crear un administrador de confianza que confíe en todos los certificados, obtengo el error:
javax.net.ssl.SSLPeerUnverifiedException: Nombre de host no verificado.

¿Qué hace Postman para que estas llamadas funcionen y cómo puedo replicarlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Postman está desactivando la verificación de certificados al omitir la comprobación del certificado SSL/TLS durante la solicitud de la API. Esto hace que las llamadas a la API funcionen sin verificar la autenticidad del certificado SSL/TLS.

    Para lograr lo mismo en Retrofit con fines de prueba, podemos crear un administrador de confianza personalizado que confíe en todos los certificados SSL/TLS. Esto se puede hacer creando un administrador de confianza y inicializándolo con una instancia de TrustAllCerts. Sin embargo, este enfoque puede plantear un riesgo de seguridad en un entorno de producción.

    Aquí tienes un ejemplo de código para crear un administrador de confianza TrustAllCerts en Retrofit:

    // Crea un administrador de confianza que confíe en todos los certificados SSL/TLS
    private static TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }
    
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }
    
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[]{};
                }
            }
    };
    
    // Crea un SSLContext con el administrador de confianza TrustAllCerts
    private static final SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    
    // Aplica el SSLContext al OkHttpClient
    OkHttpClient.Builder builder = new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
            .hostnameVerifier((hostname, session) -> true);
    OkHttpClient client = builder.build();
    
    // Crea una instancia de Retrofit con el OkHttpClient personalizado
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    

    Este código crea una instancia de OkHttpClient con un administrador de confianza personalizado que confía en todos los certificados SSL/TLS. A continuación, se aplica el OkHttpClient personalizado a una instancia de Retrofit para realizar llamadas a la API sin verificar el certificado SSL/TLS.

    Sin embargo, es importante tener en cuenta que desactivar la verificación de certificados en un entorno de producción puede plantear riesgos de seguridad y no se debe hacer a menos que sea absolutamente necesario.

Comments are closed.