java - Okhttp.Builder w/sslSocketFactory 中的 ExceptionInInitializerError

标签 java android x509certificate okhttp

我正在开发一个项目,该项目需要利用允许所有证书进行一次调用,每当我尝试设置 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();

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

最佳答案

事实证明,问题是由在 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[]{};
        }
    };
    .
    .
    .

这就解决了问题。

关于java - Okhttp.Builder w/sslSocketFactory 中的 ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57025434/

相关文章:

c# - 简单的 C# SSL 服务器 : The credentials supplied to the package were not recognized

python - pyopenssl 无法设置 x509 证书 [证书必须是 X509 实例]

Java Play 框架隐藏 URL 路由

java - 如何将首选项值获取到静态字符串变量中?

java - request.getSession(false) 导致 java.lang.IllegalStateException

java - 无法在我的网站中播放 .m4a 或 .3gpp 音频文件

android - itextpdf-itextg Android Lint 错误

c++ - 证书颁发机构的 openssl 函数问题

java - 如何使用 Google 的 Guava 库提取 Java 中的泛型类型

java - 本地化 xliff 错误消息