Retrofit2:adapter-rxjava2依赖引发证书错误,寻求解决方案
这问题我之前帮朋友排查过类似的,核心就是Retrofit生态组件版本不匹配搞的鬼!你用的Retrofit核心是2.2.0,但RxJava2 Adapter却用了2.4.0,两个版本差了好几个迭代,内部依赖的OkHttp、Converter等组件版本完全不对齐,直接导致了SSL证书验证的异常。下面给你一步步的解决办法:
1. 统一Retrofit相关组件的版本
Square出品的Retrofit、Converter、Adapter这些库是严格配套更新的,版本必须完全一致,否则很容易出现隐性冲突。你需要把Retrofit核心、Gson Converter和RxJava2 Adapter的版本统一成同一个,比如和你现在用的Adapter版本(2.4.0)对齐:
// 统一Retrofit系列版本为2.4.0 implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
2. 对齐OkHttp版本
Retrofit 2.4.0依赖的OkHttp版本是3.10.0左右,你原来用的3.7.0版本过低,和Adapter依赖的OkHttp版本冲突,这也是证书错误的关键诱因。把OkHttp和Logging Interceptor的版本统一成和Retrofit兼容的3.10.0:
implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
3. 验证RxJava/RxAndroid兼容性
你当前用的RxJava 2.2.7和RxAndroid 2.1.1是兼容的,这个不用改动。如果后续还有稳定性问题,可以考虑把RxJava升级到2.x分支的最后稳定版2.2.19,兼容性依然没问题。
4. 额外排查:证书错误的其他可能
如果统一版本后还是出现证书问题,那可能是OkHttp的SSL配置有问题,或者服务器证书本身存在缺陷。你可以先开启OkHttp的详细日志,定位具体错误:
// 初始化日志拦截器,开启BODY级别的日志 HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // 构建OkHttpClient时添加日志拦截器 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build();
查看日志里的SSL错误详情,比如是证书链不完整、域名不匹配,还是自签名证书未被信任,再针对性处理。
内容的提问来源于stack exchange,提问作者George

