Estoy trabajando en un proyecto que necesita utilizar permitir que todos los certificados para una sola llamada y cada vez que he intentado establecer el SSLSocketFactory, iba a recibir un error que indica un ExceptionInInitializerError.
Busqué y encontré SO esta pregunta, pero no se resuelva el problema para mí; mismo para este problema Git .
Mi código de ejemplo es el siguiente:
X509TrustManager trustManager = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string)
throws CertificateException {}
public void checkServerTrusted(X509Certificate[] xcs, String string)
throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
SSLContext sslContext;
SSLSocketFactory sslSocketFactory = null;
try {
sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{trustManager}, null);
sslSocketFactory = sslContext.getSocketFactory();
} catch (Exception e){
e.printStackTrace();
}
OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory,
trustManager).addInterceptor(interceptor).build();
¿Por qué estaría recibiendo un error cuando los parametros que se envían son todos válidos y no es nulo?
Como resultado, el problema está siendo causado por una NullPointerException siendo llamado profundo dentro del método constructor okhttp3. El código exacto está aquí:
Caused by: java.lang.NullPointerException: Attempt to get length of null array
at okhttp3.internal.tls.BasicTrustRootIndex.<init>(BasicTrustRootIndex.java:32)
at okhttp3.internal.platform.Platform.buildTrustRootIndex(Platform.java:288)
at okhttp3.internal.platform.AndroidPlatform.buildTrustRootIndex(AndroidPlatform.java:280)
at okhttp3.internal.platform.Platform.buildCertificateChainCleaner(Platform.java:172)
at okhttp3.internal.platform.AndroidPlatform.buildCertificateChainCleaner(AndroidPlatform.java:230)
at okhttp3.internal.tls.CertificateChainCleaner.get(CertificateChainCleaner.java:41)
at okhttp3.OkHttpClient$Builder.sslSocketFactory(OkHttpClient.java:694)
La causa de este problema es que había seguido un gran número de ejemplos en Stackoverflow (IE aquí ), que dice que usted construya su TrustManager x509 con esa return null;
línea.
La solución era simplemente cambiar la una sola línea:
X509TrustManager trustManager = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string)
throws CertificateException {}
public void checkServerTrusted(X509Certificate[] xcs, String string)
throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() {
//Here
return new X509Certificate[]{};
}
};
.
.
.
Y que resuelva el problema.