解决HostnameVerifier警告

前言

今天邮箱收到一封官方的邮件,关键内容如下
在这里插入图片描述
一个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警告,使用方案二是不起效的,还是要对症

猜你喜欢

转载自blog.csdn.net/qq_17282141/article/details/108777749