Search code examples
androidsslconnectioncertificateself-signed

Android Trying to trust a self signed certificate, get a no peer connection error


I have the following code:

  AsyncTask asyncTask = new AsyncTask() {
        @Override
        protected Object doInBackground(Object[] params) {
            try {
                HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

                DefaultHttpClient client = new DefaultHttpClient();

                SchemeRegistry registry = new SchemeRegistry();
                SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
                socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
                registry.register(new Scheme("https", socketFactory, 443));
                SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
                DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());

// Set verifier
                HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

// Example send http request
                final String url = "https://192.168.1.13:8090/version";
                HttpPost httpPost = new HttpPost(url);
                HttpResponse response = httpClient.execute(httpPost);
                Log.i("","response is:" + response);
            }catch (Exception e){
                Log.e("","error trying to get:" + e.getMessage());
            }
            return null;
        }
    };
    asyncTask.execute();

I get the following issue:

10-12 10:53:37.546: E/(24916): error trying to get:No peer certificate
10-12 10:53:38.890: E/Finsky(18904): [1] com.google.android.vending.verifier.ah.a(713): Verification id=44 error response com.android.volley.NoConnectionError: java.net.UnknownHostException: Unable to resolve host "safebrowsing.google.com": No address associated with hostname

What am I doing wrong?


Solution

  • I did manage to get the correct response using this method:

     AsyncTask asyncTask = new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] params) {
                HttpsURLConnection conn = null;
                try {
                    URL url = new URL("https://192.168.1.13:8090/version");
                    conn = (HttpsURLConnection) url.openConnection();
                    conn.setSSLSocketFactory(SSLCertificateSocketFactory.getInsecure(0, null));
                    conn.setHostnameVerifier(new AllowAllHostnameVerifier());
                    conn.setRequestProperty("Accept-Charset", "UTF-8");
                    conn.connect();
                    InputStream response = conn.getInputStream();
                    BufferedReader br = new BufferedReader(new InputStreamReader(response, "utf8"));
                    StringBuffer sb = new StringBuffer();
                    String line = "";
    
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                    }
    
                    String data = sb.toString();
                    Log.i("","response is:" + data);
                } catch (MalformedURLException e) {
                    Log.e("","error trying to get conn:" + e.getMessage());
                } catch (IOException e) {
                    Log.e("","error trying to get conn2:" + e.getMessage());
                }
                return null;
            }
        };
        asyncTask.execute();