ExceptionInInitializerError en Okhttp.Builder w / SSLSocketFactory

PGMacDesign:

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?

PGMacDesign:

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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=236199&siteId=1
Recomendado
Clasificación