【问题标题】:ExceptionInInitializerError in Okhttp.Builder w/ sslSocketFactory带有 sslSocketFactory 的 Okhttp.Builder 中的 ExceptionInInitializerError
【发布时间】:2019-07-14 07:34:45
【问题描述】:

我正在处理一个需要使用允许所有证书进行一次调用的项目,每当我尝试设置 sslSocketFactory 时,我都会收到一个指示 ExceptionInInitializerError 的错误。

我搜索了 SO 并找到了 this 问题,但它并没有为我解决问题; this Git issue 相同。

我的示例代码如下:

    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();

为什么当发送的参数都有效且不为空时,我会收到错误消息?

【问题讨论】:

    标签: java android x509certificate okhttp3


    【解决方案1】:

    事实证明,问题是由在 okhttp3 构建器方法的深处调用的 NullPointerException 引起的。确切的代码在这里:

    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)
    

    这个问题的原因是我在 Stackoverflow (IE here) 上关注了大量示例,这些示例告诉您使用 return null; 行构建 x509 TrustManager。

    解决方法是简单地更改一行:

        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[]{};
            }
        };
        .
        .
        .
    

    这解决了问题。

    【讨论】:

      猜你喜欢
      • 2019-09-23
      • 2015-08-20
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多