Okhttp: sslSocketFactory NullPointException

Created on 23 Feb 2016  ·  10Comments  ·  Source: square/okhttp

OkHttpClient.Builder mBuilder=mBuilder = new OkHttpClient.Builder();
mBuilder.sslSocketFactory(createSSLSocketFactory());
mBuilder.hostnameVerifier(new TrustAllHostnameVerifier());
mBuilder.build();
/**
 * 默认信任所有的证书
 * TODO 最好加上证书认证,主流App都有自己的证书
 *
 * @return
 */
@SuppressLint("TrulyRandom")
private static SSLSocketFactory createSSLSocketFactory() {

    SSLSocketFactory sSLSocketFactory = null;

    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, new TrustManager[]{new TrustAllManager()},
                new SecureRandom());
        sSLSocketFactory = sc.getSocketFactory();
    } catch (Exception e) {
    }

    return sSLSocketFactory;
}

private static class TrustAllManager implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
    }

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

            throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

private static class TrustAllHostnameVerifier implements HostnameVerifier {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
}

this will cause NullPointException in 3.1.2,but it's ok in 3.0.1

Caused by: java.lang.NullPointerException: Attempt to get length of null array
    at okhttp3.internal.tls.RealTrustRootIndex.<init>(RealTrustRootIndex.java:31)
    at okhttp3.internal.Platform.trustRootIndex(Platform.java:97)
    at okhttp3.internal.Platform$Android.trustRootIndex(Platform.java:271)
    at okhttp3.OkHttpClient.<init>(OkHttpClient.java:189)
    at okhttp3.OkHttpClient.<init>(OkHttpClient.java:60)
    at okhttp3.OkHttpClient$Builder.build(OkHttpClient.java:718)

Most helpful comment

Change your TrustAllManager to do this:

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }

All 10 comments

Change your TrustAllManager to do this:

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }

@swankjesse thank you

@swankjesse 谢谢 thank you

@swankjesse it's working thanks a lot

javax.net.ssl.SSLHandshakeException: Handshake failed

@ps993390891 you can add connection specification for handshake.

thank you haha

thank you

nice

javax.net.ssl.SSLHandshakeException: Handshake failed

Has the problem been solved?

Was this page helpful?
0 / 5 - 0 ratings