smanikandan14 / ThinDownloadManager

To download files and to avoid using DOWNLOAD_WITHOUT_NOTIFICATION permission if you are using Android's DownloadManager in your apps.
Apache License 2.0
783 stars 185 forks source link

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. #107

Open mannummm11 opened 7 years ago

mannummm11 commented 7 years ago

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 09-09 12:01:43.811 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:333) 09-09 12:01:43.811 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:103) 09-09 12:01:43.811 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.Connection.connect(Connection.java:169) 09-09 12:01:43.811 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:211) 09-09 12:01:43.811 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128) 09-09 12:01:43.811 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:352) 09-09 12:01:43.811 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:341) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:259) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:454) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:518) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.thin.downloadmanager.DownloadDispatcher.executeDownload(DownloadDispatcher.java:135) 09-09 12:01:43.812 31697-32142/com.logimetrix.nj.cairn W/System.err: at com.thin.downloadmanager.DownloadDispatcher.run(DownloadDispatcher.java:83)

Please answer me if any one faced same issue

noangel commented 5 years ago

The reason is HttpURLConnection does check of server certificate which fails, and exception is thrown. You need to fix DownloadDispatcher.java:

  1. Use HttpsURLConnection instead of HttpURLConnection

    import javax.net.ssl.HttpsURLConnection;
    ...
    private void transferData(HttpsURLConnection conn)
    ...
    private int readResponseHeaders( HttpsURLConnection conn)
    ...
  2. Create SSL context:

    SSLContext sslContext = null;
    try {
            TrustManager[] tm = {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
                        @Override
                        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
                        @Override
                        public X509Certificate[] getAcceptedIssuers() { return null; }
                    }
            };
            sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, tm, null);
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        } catch(Exception e) {
            e.printStackTrace();
        }
  3. After

    conn = (HttpsURLConnection) url.openConnection();

    add

    conn.setSSLSocketFactory(sslContext.getSocketFactory());

done.