Saltar al contenido

¿OkHttp admite la aceptación de certificados SSL autofirmados?

Intenta comprender el código bien previamente a utilizarlo a tu proyecto si tquieres aportar algo puedes dejarlo en los comentarios.

Solución:

Sí, lo hace.

Retrofit le permite configurar su cliente HTTP personalizado, que se configura según sus necesidades.

En cuanto a los certificados SSL autofirmados, aquí hay una discusión. El enlace contiene ejemplos de código para agregar SLL autofirmado a Android DefaultHttpClient y cargar este cliente a Retrofit.

Si necesitas OkHttpClient para aceptar SSL autofirmado, debe pasarlo personalizado javax.net.ssl.SSLSocketFactory instancia vía setSslSocketFactory(SSLSocketFactory sslSocketFactory) método.

El método más fácil para obtener una fábrica de enchufes es obtener uno de javax.net.ssl.SSLContext como se discute aquí.

Aquí hay una muestra para configurar OkHttpClient:

OkHttpClient client = new OkHttpClient();
KeyStore keyStore = readKeyStore(); //your method to obtain KeyStore
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "keystore_pass".toCharArray());
sslContext.init(keyManagerFactory.getKeyManagers(),trustManagerFactory.getTrustManagers(), new SecureRandom());
client.setSslSocketFactory(sslContext.getSocketFactory());

Código actualizado para okhttp3 (usando el constructor):

    OkHttpClient client = new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory())
            .build();

los client aquí ahora está configurado para usar certificados de su KeyStore. Sin embargo, solo confiará en los certificados de su KeyStore y no confiará en nada más, incluso si su sistema confía en ellos por defecto. (Si solo tiene certificados autofirmados en su KeyStore e intente conectarse a la página principal de Google a través de HTTPS, obtendrá SSLHandshakeException).

puedes obtener KeyStore instancia del archivo como se ve en los documentos:

KeyStore readKeyStore() 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

    // get user password and file input stream
    char[] password = getPassword();

    java.io.FileInputStream fis = null;
    try 
        fis = new java.io.FileInputStream("keyStoreName");
        ks.load(fis, password);
     finally 
        if (fis != null) 
            fis.close();
        
    
    return ks;

Si estás en Android puedes ponerlo en res/raw carpeta y obtenerlo de un Context instancia usando

fis = context.getResources().openRawResource(R.raw.your_keystore_filename);

Hay varias discusiones sobre cómo crear su almacén de claves. por ejemplo aquí

Para la versión okhttp3.OkHttpClient com.squareup.okhttp3:okhttp:3.2.0, debe usar el siguiente código:

import okhttp3.Call;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.Headers;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;

......

OkHttpClient.Builder clientBuilder = client.newBuilder().readTimeout(LOGIN_TIMEOUT_SEC, TimeUnit.SECONDS);

            boolean allowUntrusted = true;

            if (  allowUntrusted) 
                Log.w(TAG,"**** Allow untrusted SSL connection ****");
                final TrustManager[] trustAllCerts = new TrustManager[]new X509TrustManager() 
                    @Override
                    public X509Certificate[] getAcceptedIssuers() 
                        X509Certificate[] cArrr = new X509Certificate[0];
                        return cArrr;
                    

                    @Override
                    public void checkServerTrusted(final X509Certificate[] chain,
                                                   final String authType) throws CertificateException 
                    

                    @Override
                    public void checkClientTrusted(final X509Certificate[] chain,
                                                   final String authType) throws CertificateException 
                    
                ;

                SSLContext sslContext = SSLContext.getInstance("SSL");

                sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
                clientBuilder.sslSocketFactory(sslContext.getSocketFactory());

                HostnameVerifier hostnameVerifier = new HostnameVerifier() 
                    @Override
                    public boolean verify(String hostname, SSLSession session) 
                        Log.d(TAG, "Trust Host :" + hostname);
                        return true;
                    
                ;
                clientBuilder.hostnameVerifier( hostnameVerifier);
            

            final Call call = clientBuilder.build().newCall(request);

Otra cosa a tener en cuenta, si preinstala la CA en el dispositivo, puede hacer regularmente llamadas https con OKHttp, y sin aros SSL especiales. los key es agregar las configuraciones de seguridad de la red a su manifiesto.

los key para mí saber hacer esto fue que estaba recibiendo la siguiente excepción.

No se encontró el ancla de confianza para la ruta de certificación.

Aquí hay un buen artículo de Google sobre cómo configurarlo. https://developer.android.com/training/articles/security-config

Aquí hay un ejemplo de mi network_security_config.xml



    
        
            
            
        
    

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *