当你看内容前,先确认下是否自己的手机或模拟器与网络时间相同。如果不同,设置后,看是否解决,如果没有解决,再看下面的内容。
在开发中,使用的数据请求是Okhttp进行数据请求,当请求到Https的时候,出行证书错误,我的使用场景是,获取省市县三级地址数据,在模拟器上ok的,但当使用真机测试的时候发现,无法获取数据,而且报错是:
javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException
javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: Certificate not valid until Sat Nov 08 08:58:58 GMT+08:00 2014 (compared to Tue Jan 05 01:46:58 GMT+08:00 2010)
Could not validate certificate这句说明在使用OkHttp调用https接口的时候,报了SSLHandshakeException的异常,看了网上的资料,主要是服务器端使用了未被信任的证书:
简单粗暴的解决方法:
Okhttp信任所有证书
在获取OkHttpClient的时候不使用new OkhttpClinet,使用如下方法获取,然后后面的超时等设置,还是一样的。
未修改前
mOkHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
修改后
mOkHttpClient =gettUnsafeOkHttpClient().newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
getUnsafeOkHttpClient()
private static OkHttpClient getUnsafeOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
测试以后可以使用,原文博主也说,这个方法可能存在其他问题。但是是最简单的解决方式
后面测试中发现,是我的手机时间不是北京时间,哎,坑呐。。。。