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