不知道各位在用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;
}
});