轻松解决找不到SSL证书

在请求网络的时候如果使用https的话会出现下面的错误,找不到证书的路径信任锚点

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

这个错误也很好解决,最好的解决办法就是获取正规合法的https证书,让后台上传或者存在assets中,进行应用验证,这是最根本的解决办法!如果没有证书那只能忽略证书的校验了,下面是代码实现

                    SSLContext sc = SSLContext.getInstance("SSL");
                    sc.init(null, new TrustManager[]{new X509TrustManager() {


                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

                        }

                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }

                    }}, new SecureRandom());

然后引用到OkHttpClient上面去

                    client.setSslSocketFactory(sc.getSocketFactory());
                    client.setHostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    });

这样就忽略掉了正式的校验,看下整体请求的代码吧,这个是我写好的工具类,我只展示其中一段(get请求)大概明白咋添加就行了

    public static void requestData(final String url, final HashMap<String, String> params, final RequestCallBack callBack) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    SSLContext sc = SSLContext.getInstance("SSL");
                    sc.init(null, new TrustManager[]{new X509TrustManager() {


                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

                        }

                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }

                    }}, new SecureRandom());
                    final String allUrl =  url + builderParams(params);
                    Log.e("---------------------", allUrl);
                    Request request = new Request.Builder()
                            .url(allUrl)
                            .addHeader("Accept-Encoding", "musixmatch")
                            .build();
                    final OkHttpClient client = new OkHttpClient();
                    client.setSslSocketFactory(sc.getSocketFactory());
                    client.setHostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    });
                    client.setConnectTimeout(30, TimeUnit.SECONDS);
                    client.setWriteTimeout(30, TimeUnit.SECONDS);
                    client.setReadTimeout(30, TimeUnit.SECONDS);
                    client.setRetryOnConnectionFailure(false);
                    client.setConnectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION_MS));
                    client.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Request request, IOException e) {
                            if (callBack != null)
                                callBack.onFailure(e);
                        }

                        @Override
                        public void onResponse(Response response) throws IOException {

                            if (callBack == null) return;
                            if (!response.isSuccessful()) {

                                callBack.onFailure(null);
                            } else {

                                callBack.onSuccess(response.body().string());
                            }
                        }

                    });
                } catch (Exception e) {
                    if (callBack != null) callBack.onFailure(null);
                }
            }
        }).start();
    }

猜你喜欢

转载自blog.csdn.net/lanrenxiaowen/article/details/117462989