前言
今天邮箱收到一封官方的邮件,关键内容如下
一个HostnameVerifier警告,说限期不修复就会下架
Help Center
解决方案
如果你和我一样不知道HostnameVerifier是个什么东西,且确认自己没有用过这玩意儿,且项目里也没有这个东西(建议全局搜索一下HostnameVerifier),那么就能确定这个警告肯定是由于第三方库所引发的,这就需要你到你谷歌应用控制台去看看警告的详情信息(一般会在提醒列表里),google一般会告诉你是那个类触发了这个警告
查看谷歌控制台后,看到了如下内容
您的应用中 HostnameVerifier 的实施方式不安全。请参阅这篇 Google 帮助中心文章了解详情(包括修复漏洞的期限)。
存在安全漏洞的类:
com.umeng.commonsdk.statistics.idtracking.s$1
请在以下期限之前解决问题: 12/12/2020
会影响以下 APK 版本:1001885。
真相大白,是umeng的,赶紧去umeng去看看,搜索HostnameVerifier关键词,找到解决方案,搞定
如果谷歌详情里给的类路径是自己项目的,则需要手动进行这个错误的处理了;解决方案如下
stackoverflow
大致2步:
步骤1:如果是使用的Retrofit,则手动实现hostnameVerifier接口去验证域名
private static List<String> verifyHostNameArray;//app使用的域名列表
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
addInterceptor(new Interceptor(){
})
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
//方法1
for (String s:verifyHostNameArray){
if (s.contains(hostname)){
return true;
}
}
return false;
//方法2
//if ("www.baidu.com".contains(hostname) ||
//"www.alibaba.com".contains(hostname) ||
//"www.tencent.net".contains(hostname)){
// return true;
//}
//return false;
}
})
.build();
Retrofit retrofit = new Retrofit.Builder()
.client(httpClient)
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
第二步是实现webViewClient的onReceivedSslError方法,如果app没用webview就不用实现了
private class MyWebViewClient extends WebViewClient {
.
.其他方法
.
.
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
String message;
switch (error.getPrimaryError()){
case SslError.SSL_DATE_INVALID:message = "SSL_DATE_INVALID";break;
case SslError.SSL_EXPIRED:message = "SSL_EXPIRED";break;
case SslError.SSL_IDMISMATCH:message = "SSL_IDMISMATCH";break;
case SslError.SSL_INVALID:message = "SSL_INVALID";break;
case SslError.SSL_NOTYETVALID:message = "SSL_NOTYETVALID";break;
case SslError.SSL_UNTRUSTED:message = "SSL_UNTRUSTED";break;
default:message = "SslError unknown";
}
Log.d(TAG, "onReceivedSslError: " + message);
}
}
webview.setWebViewClient(new MyWebViewClient())
如果是第三方库引发的HostnameVerifier警告,使用方案二是不起效的,还是要对症