微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用OKHTTP3在IBM JRE8上提取信任管理器

如何解决无法使用OKHTTP3在IBM JRE8上提取信任管理器

任何人都可以帮忙吗?

我还使用 OKHTTP3版本4.8.1 编写 HTTP2客户端。它适用于Oracle JDK 8,但不适用于IBM JRE 8。

错误消息: java.lang.IllegalStateException:无法在okhttp3.internal.Platform@e85a0ce8上提取信任管理器,sslSocketFactory是com.ibm.jsse2.SSLSocketFactoryImpl类。

谢谢

解决方法

您所使用的方法已经过时了

https://github.com/square/okhttp/blob/cd722373281202492043f4294fccfe6f691ddc01/okhttp/src/main/kotlin/okhttp3/OkHttpClient.kt#L741

之所以弃用它,是因为它不得不对JVM进行很多假设,这在每次JVM更新或跨供应商时都会中断。您应该改为使用X509TrustManager作为参数来调用该方法

https://github.com/square/okhttp/blob/cd722373281202492043f4294fccfe6f691ddc01/okhttp/src/main/kotlin/okhttp3/OkHttpClient.kt#L767

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
    throw new IllegalStateException("Unexpected default trust managers:"
        + Arrays.toString(trustManagers));
}
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null,new TrustManager[] { trustManager },null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

OkHttpClient client = new OkHttpClient.Builder()
    .sslSocketFactory(sslSocketFactory,trustManager)
    .build();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。