Selbstsigniertes Android-Zertifikat: Vertrauensanker für Zertifizierungspfad nicht gefunden

Ich weiß, dass dieses Thema an vielen Stellen diskutiert wird, aber nachdem ich fast alle durchgearbeitet habe, habe ich beschlossen, meine erste StackOverflow-Frage zu erstellen ...

Das Problem ist folgendes:

Ich möchte eine Verbindung zu einem gesicherten Webservice (https) herstellen, der ein Zertifikat zur Einschränkung des Zugriffs und einen Benutzernamen / ein Kennwort zur Authentifizierung des Benutzers verwendet. Also habe ich ein Client-Zertifikat (p12-Datei) und ein Server-Zertifikat (pem oder der-Datei). Ich versuche, die HttpURLConnection-Klasse zu verwenden, da die Apache-Bibliothek nach meinem Kenntnisstand unter Android nicht mehr unterstützt wird.

Das sind also meine Implementierungen (serverCert und clientCert sind der vollständige Pfad zu meinen Dateien):

        // 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());
...

So kann ich meinen SSLContext verursachen und meinen Inhalt mit zwei Bescheinigungen anzeigen. Aber wenn ich versuche, meine HTTPS-Verbindung auszuführen, erhalte ich die folgende Ausnahme:

09-23 13: 43: 30.283: W / System.err (19422): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Vertrauensanker für Zertifizierungspfad nicht gefunden.

Hat einer von Ihnen jemals den folgenden Fehler festgestellt? Was war Ihre Lösung?

Dies sind die Webseiten, die ich besucht habe (ohne Erfolg):

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage