Certificado autofirmado de Android: no se ha encontrado el ancla de confianza para la ruta de certificación

Sé que este tema se discute en muchos lugares, pero después de revisar casi todos ellos, decidí crear mi primera pregunta de StackOverflow ...

El problema es el siguiente:

Quiero conectarme a un servicio web seguro (https) que use un certificado para restringir el acceso y un nombre de usuario / contraseña para autenticar al usuario. Así que tengo un certificado de cliente (archivo p12) y un certificado de servidor (archivo pem o der). Intento usar la clase HttpURLConnection, porque por lo que he oído, la biblioteca de Apache ya no será compatible con Android.

Así que estas son mis implementaciones (serverCert y clientCert son la ruta completa a mis archivos):

        // Load CAs from our reference to the file
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = new BufferedInputStream(new FileInputStream(serverCert));
        X509Certificate serverCertificate;

        try {
            serverCertificate = (X509Certificate)cf.generateCertificate(caInput);
            System.out.println("ca=" + serverCertificate.getSubjectDN());
        } finally {
            caInput.close();
        }
        Log.d(TAG, "Server Cert: " + serverCertificate);

        // Create a KeyStore containing our trusted CAs
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null);
        trustStore.setCertificateEntry("my ca", serverCertificate);

        //Load the Client certificate in the keystore
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        FileInputStream fis = new FileInputStream(clientCert);
        keyStore.load(fis,CLIENT_PASSWORD);

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

        //Build the SSL Context
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, pref.getString(Constants.clientCertificatePassword, "").toCharArray

());


    //Create the SSL context
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
...
    //And later, we use that sslContext to initiatize the socketFactory

                urlConnection = (HttpsURLConnection) requestedUrl.openConnection();
         urlConnection.setSSLSocketFactory(CertificateManager.getInstance().getSslContext().getSocketFactory());
...

Entonces puedo crear mi SSLContext y mostrar el contenido de mis dos certificados. Pero cuando intento ejecutar mi conexión HTTPS, obtengo la siguiente excepción:

09-23 13: 43: 30.283: W / System.err (19422): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: No se encuentra el ancla de confianza para la ruta de certificación.

¿Alguno de ustedes ha cumplido el siguiente error? ¿Cuál fue tu solución?

Estos son los sitios web por los que pasé (sin éxito):

http://blog.chariotsolutions.com/2013/01/https-with-client-certificates-on.html

http://nelenkov.blogspot.ch/2011/12/using-custom-certificate-trust-store-on.html

Respuestas a la pregunta(1)

Su respuesta a la pregunta