无法在android10平台上提取信任管理器,sslSocketFactory是class com.android.org.conscrypt.OpenSSLSocketFactoryImpl。记录一下填坑内容。
服务器测试接口是http的,不是https,之前一直拿的8.0的手机调试一直好好的,今天换成android 10的手机测试发现请求服务器的时候奔溃了。,
网上这个问题比较少嘞,在此记录一下。
有大佬说这是okhttp的问题,解决方案是 X509TrustManager改成X509ExtendedTrustManager。
public class SSLSocketClient
{
//获取这个SSLSocketFactory
public static SSLSocketFactory getSSLSocketFactory()
{
try
{
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
//获取TrustManager
private static TrustManager[] getTrustManager()
{
//就是把下面这个X509TrustManager更换一下
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager()
{
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
{
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
{
}
@Override
public X509Certificate[] getAcceptedIssuers()
{
return new X509Certificate[]{};
}
}};
return trustAllCerts;
}
//获取HostnameVerifier
public static HostnameVerifier getHostnameVerifier()
{
HostnameVerifier hostnameVerifier = new HostnameVerifier()
{
@Override
public boolean verify(String s, SSLSession sslSession)
{
return true;
}
};
return hostnameVerifier;
}
}
上面的代码是我之前一直在用的,android10就不行了。按照大佬的说法试过换成 X509ExtendedTrustManager但是依然不行,不知道是不是更换方式有问题。
原先我的处理方案是在创建okhttpClient的时候,判断,如果是android10及以上的版本,就不添加sslSocketFactory方法。。这里感谢评论第一位置的 --sharp 指出更好的方案~(#^.^#)。
在代码中,使用 OkHttpClient.Builder 类设置sslSocketFactory,增加了一个参数X509TrustManager。
查看sslSocketFactory方法源码可以看到上面的说明中,google也是这么推荐滴。OK~完美运行~