当你看内容前,先确认下是否自己的手机或模拟器与网络时间相同。如果不同,设置后,看是否解决,如果没有解决,再看下面的内容。
在开发中,使用的数据请求是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的异常,看了网上的资料,主要是服务器端使用了未被信任的证书:
原文博主地址:http://blog.csdn.net/voidmain_123/article/details/52703464
简单粗暴的解决方法:
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 {
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[]{};
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL" );
sslContext.init(null , trustAllCerts, new java.security.SecureRandom());
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);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
测试以后可以使用,原文博主也说,这个方法可能存在其他问题。但是是最简单的解决方式 后面测试中发现,是我的手机时间不是北京时间,哎,坑呐。。。。