it-swarm.com.de

Wie installiere ich ein vertrauenswürdiges CA-Zertifikat auf Android Gerät?

Ich habe mein eigenes CA-Zertifikat erstellt und möchte es nun auf meinem Android Froyo-Gerät (HTC Desire Z) installieren, damit das Gerät meinem Zertifikat vertraut.

Android speichert CA-Zertifikate in seinem Java - Keystore in /system/etc/security/cacerts.bks. Ich kopierte die Datei auf meinen Computer, fügte mein Zertifikat mit portecle 1.5 hinzu und schob es zurück auf das Gerät.

Nun scheint Android die Datei nicht automatisch neu zu laden. Ich habe in mehreren Blogposts gelesen, dass ich das Gerät neu starten muss. Andernfalls wird die Datei erneut mit der Originaldatei überschrieben.

Mein nächster Versuch war, das Zertifikat von der SD-Karte zu installieren, indem ich es kopiere und die entsprechende Option aus dem Einstellungsmenü verwende. Das Gerät teilt mir mit, dass das Zertifikat installiert wurde, aber anscheinend vertraut es dem Zertifikat nicht. Wenn ich versuche, den Keystore auf meinen Computer zu kopieren, finde ich außerdem immer noch den Originalbestand cacerts.bks.

Wie installiere ich mein eigenes Stammzertifizierungsstellenzertifikat auf einem Android 2.2-Gerät als vertrauenswürdiges Zertifikat? Gibt es eine Möglichkeit, dies programmgesteuert zu tun?

120

Vor Android KitKat müssen Sie Ihr Gerät rooten, um neue Zertifikate zu installieren.

Von Android KitKat (4.0) bis Nougat (7.0) ist es möglich und einfach. Ich konnte das installieren Charles Web Debbuging Proxy-Zertifikat auf meinem nicht gerooteten Gerät und erfolgreiches Aufspüren des SSL-Verkehrs.

Auszug aus http://wiki.cacert.org/FAQ/ImportRootCert

Vor Android Version 4.0, mit Android Version Gingerbread & Froyo) gab es eine einzige schreibgeschützte Datei (/system/etc/security/cacerts.bks) Enthält den Trust Store mit allen Zertifizierungsstellenzertifikaten ("System" -Zertifikaten), die standardmäßig unter Android als vertrauenswürdig eingestuft werden. Sowohl System-Apps als auch alle Anwendungen, die mit dem SDK Android=) entwickelt wurden, verwenden dies. Befolgen Sie diese Anweisungen zum Installieren von CAcert-Zertifikaten auf Android Lebkuchen, Froyo, ...

Ausgehend von Android 4.0 (Android ICS/'Ice Cream Sandwich', Android 4.3 'Jelly Bean' & Android= 4.4 "KitKat"), vertrauenswürdige Systemzertifikate befinden sich auf der (schreibgeschützten) Systempartition im Ordner "/ system/etc/security /" als einzelne Dateien. Benutzer können jedoch jetzt problemlos ihre eigenen "Benutzerzertifikate" hinzufügen gespeichert in '/ data/misc/keychain/certs-added'.

Vom System installierte Zertifikate können auf dem Android Gerät im Bereich Einstellungen -> Sicherheit -> Zertifikate -> 'System' verwaltet werden, während die vom Benutzer vertrauenswürdigen Zertifikate im Bereich 'Benutzer' verwaltet werden. Wenn vertrauenswürdige Benutzerzertifikate verwendet werden, zwingt Android) den Benutzer des Android=) Geräts, zusätzliche Sicherheitsmaßnahmen zu ergreifen: die Verwendung eines PIN-Codes, Eine Mustersperre oder ein Kennwort zum Entsperren des Geräts sind erforderlich, wenn vom Benutzer bereitgestellte Zertifikate verwendet werden.

Das Installieren von CAcert-Zertifikaten als "user trusted" -Zertifikate ist sehr einfach. Das Installieren neuer Zertifikate als "System Trusted" -Zertifikate erfordert mehr Arbeit (und erfordert Root-Zugriff), hat jedoch den Vorteil, dass die Android) -Sperrbildschirmanforderung vermieden wird.

Ab Android N ab wird es etwas schwieriger, siehe diesen Auszug aus der Charles-Proxy-Website :

Ab Android N müssen Sie Ihrer App eine Konfiguration hinzufügen, damit sie den von Charles SSL Proxying generierten SSL-Zertifikaten vertraut. Dies bedeutet, dass Sie SSL Proxying nur mit Apps verwenden können, die Sie verwenden Steuerung.

Um Ihre App so zu konfigurieren, dass sie Charles vertraut, müssen Sie Ihrer App eine Konfigurationsdatei für die Netzwerksicherheit hinzufügen. Diese Datei kann die Systemvorgabe überschreiben und es Ihrer App ermöglichen, von Benutzern installierten CA-Zertifikaten (z. B. dem Charles Root-Zertifikat) zu vertrauen. Sie können angeben, dass dies nur in Debugbuilds Ihrer Anwendung gilt, sodass Produktionsbuilds das Standardvertrauensprofil verwenden.

Fügen Sie Ihrer App die Datei res/xml/network_security_config.xml hinzu:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

Fügen Sie dann wie folgt einen Verweis auf diese Datei im Manifest Ihrer App hinzu:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application Android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>
95
Dean Wild

Ich habe viel Zeit damit verbracht, eine Antwort auf diese Frage zu finden (ich benötige Android um StartSSL-Zertifikate zu sehen). Fazit: Android 2.1 und 2.2 ermöglichen es Ihnen) Zertifikate importieren, aber nur für die Verwendung mit WLAN und VPN Es gibt keine Benutzeroberfläche zum Aktualisieren der Liste vertrauenswürdiger Stammzertifikate, es wird jedoch diskutiert, diese Funktion hinzuzufügen BKS-Datei.

Details und Links: http://www.mcbsys.com/techblog/2010/12/Android-certificates/ . In diesem Beitrag finden Sie den Link zu Android Bug 11231 - Sie möchten möglicherweise Ihre Stimme und Frage zu diesem Bug hinzufügen.

43
Mark Berry

Wenn Sie Ihr Zertifikat für HTTPS-Verbindungen benötigen, können Sie der Anwendung die BKS-Datei als unformatierte Ressource hinzufügen und DefaultHttpConnection erweitern, sodass Ihre Zertifikate für HTTPS-Verbindungen verwendet werden.

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);
        }
    }
}
15
Alexander Egger

Die Anleitung verknüpft hier wird wahrscheinlich die ursprüngliche Frage beantworten, ohne dass ein benutzerdefinierter SSL-Connector programmiert werden muss.

Es wurde eine sehr detaillierte Anleitung zum Importieren von Stammzertifikaten gefunden, die Sie durch die Installation vertrauenswürdiger Zertifizierungsstellenzertifikate auf verschiedenen Versionen von Android Geräte (unter anderen Geräten) führt.

Grundsätzlich müssen Sie:

  1. Laden Sie die Datei cacerts.bks von Ihrem Telefon herunter.

    adb pull /system/etc/security/cacerts.bks cacerts.bks

  2. Laden Sie die CRT-Datei von der Zertifizierungsstelle herunter, die Sie zulassen möchten.

  3. Ändern Sie die Datei cacerts.bks auf Ihrem Computer mit BouncyCastle Provider

  4. Laden Sie die Datei cacerts.bks zurück auf Ihr Telefon und starten Sie es neu.

Hier finden Sie eine detaillierte schrittweise Anleitung zum Aktualisieren früherer Android Telefone: So aktualisieren Sie den Keystore der HTTPS-Sicherheitszertifizierungsstelle auf Geräten vor Android-4.

9

Hier gibt es eine VIEL einfachere Lösung als hier oder in verwandten Threads. Wenn Sie eine Webansicht verwenden (wie ich), können Sie dies erreichen, indem Sie eine JAVASCRIPT-Funktion darin ausführen. Wenn Sie keine Webansicht verwenden, möchten Sie möglicherweise eine ausgeblendete für diesen Zweck erstellen. Hier ist eine Funktion, die in nahezu jedem Browser (oder jeder Webansicht) funktioniert, um eine Installation zu starten (im Allgemeinen über das gemeinsam genutzte os cert-Repository, auch auf einem Droid). Es benutzt einen netten Trick mit iFrames. Übergeben Sie einfach die URL einer CRT-Datei an diese Funktion:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

AKTUALISIEREN:

Der iframe-Trick funktioniert bei Droids ab API 19, ältere Versionen der Webansicht funktionieren jedoch nicht so. Die allgemeine Idee funktioniert jedoch immer noch - einfach die Datei mit einer Webansicht herunterladen/öffnen und dann das Betriebssystem übernehmen lassen. Dies kann eine einfachere und universellere Lösung sein (in der aktuellen Version Java jetzt):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

Beachten Sie, dass instance_ eine Referenz auf die Aktivität ist. Dies funktioniert perfekt, wenn Sie die URL des Zertifikats kennen. In meinem Fall löse ich das jedoch dynamisch mit der serverseitigen Software. Ich musste eine ganze Menge zusätzlichen Codes hinzufügen, um eine Umleitungs-URL abzufangen und diese auf eine Weise aufzurufen, die keinen Absturz aufgrund einer Threading-Komplikation verursachte, aber ich werde hier nicht all diese Verwirrung hinzufügen ...

4
BuvinJ

Was ich getan habe, um Startssl-Zertifikate zu verwenden, war ganz einfach. (auf meinem verwurzelten Telefon)

Ich habe /system/etc/security/cacerts.bks auf meine SD-Karte kopiert

Heruntergeladen http://www.startssl.com/certs/ca.crt und http://www.startssl.com/certs/subclass1.server.ca.crt

Ging zu portecle.sourceforge.net und ließ portecle direkt von der Webseite aus laufen.

Öffnete meine cacerts.bks-Datei von meiner SD-Karte (gab nichts ein, wenn nach einem Passwort gefragt wurde)

Wähle import in portacle und öffne sub.class1.server.ca.crt, in meinem Fall hatte es schon die ca.crt aber vielleicht musst du das auch installieren.

Speichere den Keystore und kopiere ihn baxck nach /system/etc/security/cacerts.bks (Ich habe zuerst ein Backup dieser Datei gemacht, nur für den Fall)

Ich habe mein Telefon neu gestartet und kann jetzt meine Site mit einem StartSSL-Zertifikat ohne Fehler aufrufen.

3
hans

Hier ist eine alternative Lösung, mit der Ihr Zertifikat tatsächlich zur integrierten Liste der Standardzertifikate hinzugefügt wird: Allen Zertifikaten mit HttpClient über HTTPS vertrauen

Dies funktioniert jedoch nur für Ihre Anwendung. Es gibt keine Möglichkeit, dies programmgesteuert für alle Anwendungen auf dem Gerät eines Benutzers durchzuführen, da dies ein Sicherheitsrisiko darstellen würde.

0
emmby