手机移动程序开发安卓开发小窝安卓资源收集

OKGO调用HTTPS遇到的问题之:SSLPeerUnverif

2018-05-13  本文已影响8人  此生唯一自传

不知道各位在用OKGO调用https接口时遇没遇到过这样的报错:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated.

这是由于https请求证书验证问题,直接请求一般都会失败。一般是做证书验证处理或者忽略证书验证。 


OKGO3.0的文档上在application中对OKGO的初始化有一种忽略证书验证的方案:

OkHttpClient.Builder builder = new OkHttpClient.Builder();

HttpsUtils.SSLParams sslParams1 = HttpsUtils.getSslSocketFactory();

builder.sslSocketFactory(sslParams1.sSLSocketFactory, sslParams1.trustManager);

但是加上这段代码,某些情况还是不行(不知道是否跟服务端配置有关),继续往下解决:

我们知道OKGO是基于OkHttp的,在OkHttp中:OkHttpClient的一个对象hostnameVerifier的一个叫verify的方法,关于HostnameVerifier是一个接口,具体可以看:Interface HostnameVerifier OkHttpClient是使用OkHostnameVerifier这个实现类的verify方法,如下:

@Override public boolean verify(String host, SSLSession session) {

    try {

      Certificate[] certificates = session.getPeerCertificates();

      return verify(host, (X509Certificate) certificates[0]);

    } catch (SSLException e) {

      return false;

    }

  }

  public boolean verify(String host, X509Certificate certificate) {

    return verifyAsIpAddress(host)

        ? verifyIpAddress(host, certificate)

        : verifyHostname(host, certificate);

  }

具体就是验证证书,然后成功返回true,失败返回false。就是这里返回了false到导致我们出错。

所以解决方案就是在OkGo设置时新建一个HostnameVerifier对象,强制就算验证失败也成功:

OkHttpClient.Builder builder = new OkHttpClient.Builder();

HttpsUtils.SSLParams sslParams1 = HttpsUtils.getSslSocketFactory(); //这两句也别忘了加上,不加还是会报错的

builder.sslSocketFactory(sslParams1.sSLSocketFactory, sslParams1.trustManager);

builder.hostnameVerifier(new HostnameVerifier() {

    @Override

    public boolean verify(String hostname, SSLSession session) {

        //强行返回true 即验证成功

        return true;

}

});


上一篇 下一篇

猜你喜欢

热点阅读