title: Android SSL HttpGet (No peer certificate) error OR (Connection closed by peer) error
body: <p>I am trying to do a simple HttpGet to read a webpage. I have this working on iOS and working on Android over http, but not https.</p>
  
  <p>The url is an internal network IP and custom port, so I can read with http like this using a path of <code>http://ipaddress:port/MyPage.html</code></p>
  
  <pre><code>HttpClient httpclient = new DefaultHttpClient(httpParameters);
                      HttpResponse response;
          String responseString = null;
          try {
              // Try connection
              HttpGet get = new HttpGet(params[0].path);
              get.addHeader("Authorization",
                      "Basic "
                              + Base64.encodeBytes(new String(params[0].username + ":" + params[0].password)
                                      .getBytes()));
          response = httpclient.execute(get);
          StatusLine statusLine = response.getStatusLine();
          if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
              ByteArrayOutputStream out = new ByteArrayOutputStream();
              response.getEntity().writeTo(out);
              out.close();
              responseString = out.toString();
          } else {
              // Closes the connection.
              response.getEntity().getContent().close();
              throw new IOException(statusLine.getReasonPhrase());
          }
      } catch (ClientProtocolException e) {
          Log.e(TAG, "ClientProtocolException");
          this.e = e;
      } catch (IOException e) {
          Log.e(TAG, "IOException");
          this.e = e;
      }
      return responseString;
  </code></pre>
  
  <p>When I try using https, I get the <code>No peer certificate</code> error. So I have tried using this code:
  <code>HttpClient httpclient = new DefaultHttpClient(httpParameters);</code></p>
  
  <pre><code>private HttpClient createHttpClient() {
          try {
              KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
              trustStore.load(null, null);
  
              SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
              sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  
              HttpParams params = new BasicHttpParams();
              HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
              HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
              HttpProtocolParams.setUseExpectContinue(params, true);
  
              SchemeRegistry schReg = new SchemeRegistry();
              schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
              schReg.register(new Scheme("https", sf, 8080));
              ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
  
              return new DefaultHttpClient(conMgr, params);
  
          } catch (Exception e) {
              return new DefaultHttpClient();
          }
      }
  </code></pre>
  
  <p>but this gives me a <code>Connection closed by peer</code> error.</p>
  
  <p>What am I doing wrong? I can safely ignore the certificate, as it's an internal network with self signed cert, however I have no control over the vert and users of my app may have different certs, so I really need to auto accept or bypass it.</p>
  
  <p>Thanks</p>
  
  <p>EDIT ------------------------------</p>
  
  <p>After trying My-Name-Is answer below:
  I've created a CustomX509TrustManager class as suggested, then create a custom HttpClient using it like this:</p>
  
  <pre><code>private HttpClient sslClient(HttpClient client) {
          try {
              CustomX509TrustManager tm = new CustomX509TrustManager();
              SSLContext ctx = SSLContext.getInstance("TLS");
              ctx.init(null, new TrustManager[] { tm }, null);
              SSLSocketFactory ssf = new MySSLSocketFactory(ctx);
              ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
              ClientConnectionManager ccm = client.getConnectionManager();
              SchemeRegistry sr = ccm.getSchemeRegistry();
              sr.register(new Scheme("https", ssf, 8080));
              return new DefaultHttpClient(ccm, client.getParams());
          } catch (Exception ex) {
              return null;
          }
      }
  </code></pre>
  
  <p>And finally use this HttpClient like this:</p>
  
  <pre><code>private class httpGETTask extends AsyncTask&lt;GetParams, Void, String&gt; {
  private Exception e = null;
  
  @Override
  protected String doInBackground(GetParams... params) {
      // Set connection parameters
      HttpParams httpParameters = new BasicHttpParams();
      int timeoutConnection = 15000;
      HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
      int timeoutSocket = 15000;
      HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
  
      Log.v(TAG, params[0].path);
      HttpClient httpclient = new DefaultHttpClient(httpParameters);
      httpclient = sslClient(httpclient);
  
      HttpResponse response;
      String responseString = null;
      try {
          // Try connection
          HttpGet get = new HttpGet(params[0].path);
          get.addHeader("Authorization",
                  "Basic "
                          + Base64.encodeBytes(new String(params[0].username + ":" + params[0].password)
                                  .getBytes()));
  
          response = httpclient.execute(get);
          StatusLine statusLine = response.getStatusLine();
          if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
              ByteArrayOutputStream out = new ByteArrayOutputStream();
              response.getEntity().writeTo(out);
              out.close();
              responseString = out.toString();
          } else {
              // Closes the connection.
              response.getEntity().getContent().close();
              throw new IOException(statusLine.getReasonPhrase());
          }
      } catch (ClientProtocolException e) {
          Log.e(TAG, "ClientProtocolException");
          this.e = e;
      } catch (IOException e) {
          Log.e(TAG, "IOException");
          this.e = e;
      }
      return responseString;
  </code></pre>
  
  <p>The logged path is in the format <code>https://ipaddress:8080/Page.html</code>
  But I get a <code>Connection closed By Peer</code> error:</p>
  
  <blockquote>
    <p>05-24 08:20:32.500: E/ConnectionHelper(1129): IOException 05-24
    08:20:32.550: E/ConnectionHelper(1129): Exception loading contents
    05-24 08:20:32.550: E/ConnectionHelper(1129):
    javax.net.ssl.SSLException: Connection closed by peer 05-24
    08:20:32.550: E/ConnectionHelper(1129):   at
    org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native
    Method) 05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.(OpenSSLSocketImpl.java:643)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:614)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.io.SocketInputBuffer.(SocketInputBuffer.java:70)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:172)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    05-24 08:20:32.550: E/ConnectionHelper(1129):     at
    com.d_apps.my_app.connection_helpers.ConnectionHelper$httpGETTask.doInBackground(ConnectionHelper.java:114)</p>
  </blockquote>