• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Https SSLPeerUnverifiedException

HeavensSentSword

Well-Known Member
I am trying to connection to a goDaddy server with at cert from them that I have installed in the raw resource folder in the app. I am trying to download a json file form it but then get this exception.
Java:
javax.net.ssl.SSLPeerUnverifiedException: Hostname domaibname not verified:

This is a common problem but I have tried to find ways to get this to work right.
This is the class that I am using to do all the Https handling code
Java:
public class MyHttpsGet extends AsyncTask<String, Void, String> {

    Context context;

    int cert;
    boolean allowHost;
    private String username;
    private String password;

    //this is used if you need a password and username
    //mainly for logins to a webserver
    public MyHttpsGet(String username, String password, Context context, int cert)
    {
        this.context = context;
        this.cert = cert;
        this.allowHost = allowHost;
        this.username = username;
        this.password = password;

    }

    //used for image downloading
    public MyHttpsGet(){}

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        return httpsDownloadData(url, context, cert);
    }

    public String httpsDownloadData (String urlString, Context context, int certRawResId)
    {
        String respone = null;

        try {
            // build key store with ca certificate
            KeyStore keyStore = buildKeyStore(context, certRawResId);

            // Create a TrustManager that trusts the CAs in our KeyStore
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(keyStore);

            // Create an SSLContext that uses our TrustManager
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), null);

            // Create a connection from url
            URL url = new URL(urlString);
            if (username != null) {
                Authenticator.setDefault(new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password.toCharArray());
                    }
                });
            }
            HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
            urlConnection.setSSLSocketFactory(sslContext.getSocketFactory());


            int statusCode = urlConnection.getResponseCode();
            Log.d("Status code: ", Integer.toString(statusCode));


            InputStream inputStream = urlConnection.getInputStream();
            if (inputStream != null) {
                respone = streamToString(inputStream);
                inputStream.close();
            }

        }catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }

        Log.d("MyHttps Respones: ", respone);
        return respone;
    }


    private static KeyStore buildKeyStore(Context context, int certRawResId){
        // init a default key store
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = null;
        try {
            keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);

            // read and add certificate authority
            Certificate cert = readCert(context, certRawResId);
            keyStore.setCertificateEntry("ca", cert);


        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return keyStore;

    }

    private static Certificate readCert(Context context, int certResourceId) throws IOException {

        // read certificate resource
        InputStream caInput = context.getResources().openRawResource(certResourceId);

        Certificate ca = null;
        try {
            // generate a certificate
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            ca = cf.generateCertificate(caInput);
        } catch (CertificateException e) {
            e.printStackTrace();
        } finally {
            caInput.close();
        }

        return ca;
    }

    //this is used for downloading strings from an http or https connection
    private String streamToString(InputStream is) throws IOException {

        StringBuilder sb = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }

        return sb.toString();
    }


}

And this is how i am calling it;

Java:
MyHttpsGet task = new MyHttpsGet(username, password,myContext, R.raw.gdroot_g2);
            try {
                myJson = task.execute(myUrl).get();
                Log.d("Promo Json: " , myJson);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            new runningMan().execute();

Thank you for any help with this, I am stumped on where to go from here.
 
Last edited:
i figured it out. I was using the wrong website so the domain names didn't match. So if anyone needs a easy to use https cert builder and connection class there it is.
Have fun
 
Back
Top Bottom