Hoe installeer ik een vertrouwd CA-certificaat op een Android-toestel?

Ik heb mijn eigen CA certificaat aangemaakt en nu wil ik het installeren op mijn Android Froyo toestel (HTC Desire Z), zodat het toestel mijn certificaat vertrouwt.

Android slaat CA certificaten op in zijn Java sleutelbewaarplaats in /system/etc/security/cacerts.bks. Ik heb het bestand naar mijn computer gekopieerd, mijn certificaat toegevoegd met portecle 1.5 en het terug naar het toestel geduwd.

Nu lijkt Android het bestand niet automatisch opnieuw te laden. Ik heb in verschillende blog posts gelezen dat ik het toestel opnieuw moet opstarten. Als ik dat doe, wordt het bestand weer overschreven met het originele bestand.

Mijn volgende poging was om het certificaat te installeren vanaf de SD-kaart door het te kopiëren en de volgens optie te gebruiken in het instellingen menu. Het apparaat vertelt me dat het certificaat is geïnstalleerd, maar blijkbaar vertrouwt het het certificaat niet. Bovendien, als ik probeer om de sleutelbewaarplaats naar mijn computer te kopiëren, vind ik nog steeds de originele voorraad cacerts.bks.

Dus, wat is de juiste manier om mijn eigen root CA certificaat te installeren op een Android 2.2 toestel als een vertrouwd certificaat? Is er een manier om het programmatisch te doen?

Ik heb veel tijd besteed om hier een antwoord op te vinden (ik heb Android nodig om StartSSL certificaten te zien). Conclusie: Android 2.1 en 2.2 staan je toe om certificaten te importeren, maar alleen voor gebruik met WiFi en VPN. Er is geen gebruikersinterface voor het bijwerken van de lijst van vertrouwde root-certificaten, maar er is discussie over het toevoegen van die functie. Het is onduidelijk of er een betrouwbare workaround is voor het handmatig bijwerken en vervangen van het cacerts.bks bestand.

Details en links: http://www.mcbsys.com/techblog/2010/12/android-certificates/. In dat bericht, zie de link naar Android bug 11231--u wilt misschien uw stem en vraag toevoegen aan die bug.

Commentaren (4)

Als u uw certificaat nodig hebt voor HTTPS-verbindingen, kunt u het .bks-bestand als een raw resource aan uw toepassing toevoegen en DefaultHttpConnection uitbreiden zodat uw certificaten worden gebruikt voor HTTPS-verbindingen.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}
Commentaren (5)

Hier's een alternatieve oplossing die in feite uw certificaat toevoegt aan de ingebouwde lijst van standaard certificaten: https://stackoverflow.com/questions/2642777/trusting-all-certificates-using-httpclient-over-https/6378872#6378872

Het zal echter alleen werken voor uw toepassing. Er is geen manier om het programmatisch te doen voor alle toepassingen op het apparaat van een gebruiker, omdat dat een veiligheidsrisico zou zijn.

Commentaren (0)