title: OkHttp javax.net.ssl.SSLPeerUnverifiedException: Hostname domain.com not verified
body: <p>I've been trying for days to get this working. I'm trying to connect to my server over <strong>https</strong> with a self signed certificate. I don't think there is any pages or examples that I haven't read by now. </p>
  
  <p>What I have done:</p>
  
  <ol>
  <li>Created bks keystore by following this tutorial: <a href="http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html">http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html</a></li>
  </ol>
  
  <p>It uses <code>openssl s_client -connect domain.com:443</code> to get the certificate from the server. Then creates a bks keystore using bouncy castle. </p>
  
  <ol start="2">
  <li><p>Reading created keystore from raw folder adding it to sslfactory and and then to OkHttpClient. Like this:</p>
  
  <pre><code>public ApiService() {
      mClient = new OkHttpClient();
      mClient.setConnectTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS);
      mClient.setReadTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS);
      mClient.setCache(getCache());
      mClient.setCertificatePinner(getPinnedCerts());
      mClient.setSslSocketFactory(getSSL());
  }
  
  protected SSLSocketFactory getSSL() {
      try {
          KeyStore trusted = KeyStore.getInstance("BKS");
          InputStream in = Beadict.getAppContext().getResources().openRawResource(R.raw.mytruststore);
          trusted.load(in, "pwd".toCharArray());
          SSLContext sslContext = SSLContext.getInstance("TLS");
          TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
          trustManagerFactory.init(trusted);
          sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
          return sslContext.getSocketFactory();
      } catch(Exception e) {
          e.printStackTrace();
      }
      return null;
  }
  
  public CertificatePinner getPinnedCerts() {
      return new CertificatePinner.Builder()
              .add("domain.com", "sha1/theSha=")
              .build();
  }
  </code></pre></li>
  <li><p>This for some reason this always generates a <code>SSLPeerUnverifiedException</code> with or without the keystore. And with or without the <code>CertificatePinner</code>. </p>
  
  <pre><code>javax.net.ssl.SSLPeerUnverifiedException: Hostname domain.com not verified: 0         
   W/System.err﹕ certificate: sha1/theSha=
   W/System.err﹕ DN: 1.2.840.113549.1.9.1=#1610696e666f40626561646963742e636f6d,CN=http://domain.com,OU=development,O=domain,L=Valencia,ST=Valencia,C=ES
   W/System.err﹕ subjectAltNames: []
   W/System.err﹕ at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:124)
   W/System.err﹕ at com.squareup.okhttp.Connection.connect(Connection.java:143)
   W/System.err﹕ at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:185)
   W/System.err﹕ at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
   W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341)
   W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
   W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
   W/System.err﹕ at com.squareup.okhttp.Call.getResponse(Call.java:273)
   W/System.err﹕ at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:230)
   W/System.err﹕ at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:201)
   W/System.err﹕ at com.squareup.okhttp.Call.execute(Call.java:81)
   ...
  </code></pre></li>
  </ol>
  
  <p>What am I doing wrong?</p>