OkHttp报错javax.net.ssl.SSLHandshakeException: Handshake failed

来源:互联网 发布:mac输入法下载安装 编辑:程序博客网 时间:2024/05/17 15:57

当你看内容前,先确认下是否自己的手机或模拟器与网络时间相同。如果不同,设置后,看是否解决,如果没有解决,再看下面的内容。

在开发中,使用的数据请求是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 {            // 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);        }    }

测试以后可以使用,原文博主也说,这个方法可能存在其他问题。但是是最简单的解决方式
后面测试中发现,是我的手机时间不是北京时间,哎,坑呐。。。。

阅读全文
0 0
原创粉丝点击