SSL証明書が見つからない場合は簡単に解決できます

ネットワークリクエスト時にhttpsを使用した場合、以下のエラーが発生し、証明書のパストラストアンカーが見つかりません

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。

このエラーも簡単に解決できます。最善の解決策は、正式かつ合法的な https 証明書を取得し、それをバックグラウンドでアップロードするか、アプリケーション検証のためにアセットに保存することです。これが最も根本的な解決策です。証明書がない場合は、証明書の検証を無視することしかできません。次のコードの実装です。

                    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;
                        }
                    });

このように、形式的な検証は無視されます。リクエスト全体のコードを見てみましょう。これは私が書いたツール クラスです。そのうちの 1 つだけを示します (リクエストの取得)。追加方法を理解する必要があるだけです。 。

    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