title: Android SSL No peer certificate
body: <p>I've got an exception: No peer certificate</p>
  
  <p>When I'm asking google, then i get solution, where i'm trusting all certificates. But answers of this question are, it's insecure.</p>
  
  <p>So I called the class:</p>
  
  <pre><code>HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
             HttpClient 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());
  
             HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
             Log.v("URL:", Url[0]);
             HttpPost post = new HttpPost(Url[0]);  
             post.addHeader("Username", Url[1]);
             post.addHeader("Passwort", Url[2]);
             HttpResponse getResponse = httpClient.execute(post); //Wirft Exception
             HttpEntity responseEntity = getResponse.getEntity();
             UserID = Integer.parseInt(responseEntity.getContent().toString());
  </code></pre>
  
  <p>This is my class:</p>
  
  <pre><code>class MyHttpClient extends DefaultHttpClient {
  
  final Context context;
  
  public MyHttpClient(Context context) {
      this.context = context;
  }
  
  @Override
  protected ClientConnectionManager createClientConnectionManager() {
      SchemeRegistry registry = new SchemeRegistry();
      registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
      // Register for port 443 our SSLSocketFactory with our keystore
      // to the ConnectionManager
      registry.register(new Scheme("https", (SocketFactory) newSslSocketFactory(), 443));
      return new SingleClientConnManager(getParams(), registry);
  }
  
  private SSLSocketFactory newSslSocketFactory() {
      try {
          // Get an instance of the Bouncy Castle KeyStore format
          KeyStore trusted = KeyStore.getInstance("BKS");
          // Get the raw resource, which contains the keystore with
          // your trusted certificates (root and any intermediate certs)
          InputStream in = context.getResources().openRawResource(R.raw.mykey);
          try {
              // Initialize the keystore with the provided trusted certificates
              // Also provide the password of the keystore
              trusted.load(in, "PASSWORT".toCharArray());
          } finally {
              in.close();
          }
          // Pass the keystore to the SSLSocketFactory. The factory is responsible
          // for the verification of the server certificate.
          SSLSocketFactory sf = new SSLSocketFactory(trusted);
          // Hostname verification from certificate
          // [url=http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506]Chapter2.Connection management[/url]
          sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
          return sf;
      } catch (Exception e) {
          throw new AssertionError(e);
      }
  }
  </code></pre>
  
  <p>}</p>