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

134

Ich habe mein eigenes CA-Zertifikat erstellt und möchte es jetzt 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 habe die Datei auf meinen Computer kopiert, mein Zertifikat mit Portecle 1.5 hinzugefügt und auf das Gerät zurückgeschoben.

Jetzt scheint Android die Datei nicht automatisch neu zu laden. Ich habe in mehreren Blog-Posts gelesen, dass ich das Gerät neu starten muss. Dies führt dazu, dass die Datei erneut mit der Originaldatei überschrieben wird.

Mein nächster Versuch war, das Zertifikat von der SD-Karte zu installieren, indem ich es kopierte und die entsprechende Option aus dem Einstellungsmenü verwendete. 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 kann ich mein eigenes Stammzertifizierungsstellenzertifikat als vertrauenswürdiges Zertifikat auf einem Android 2.2-Gerät installieren? Gibt es eine Möglichkeit, dies programmgesteuert zu tun?

Björn Marschollek
quelle
Sie können hier von einem gerooteten Telefon ausgehen. :)
Björn Marschollek

Antworten:

115

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 Charles Web Debbuging Proxy-Zertifikat auf meinem nicht gerooteten Gerät installieren und den SSL-Verkehr erfolgreich abhören.

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

Vor der Android-Version 4.0 gab es mit der Android-Version Gingerbread & Froyo eine einzige schreibgeschützte Datei (/system/etc/security/cacerts.bks), die den Trust Store mit allen CA-Zertifikaten ('system') enthielt, denen standardmäßig vertraut wurde Android. Dies wird sowohl von System-Apps als auch von allen mit dem Android SDK entwickelten Anwendungen verwendet. Verwenden Sie diese Anweisungen zum Installieren von CAcert-Zertifikaten auf Android Gingerbread, Froyo, ...

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

Vom System installierte Zertifikate können auf dem Android-Gerät im Abschnitt "Einstellungen" -> "Sicherheit" -> "Zertifikate" -> "System" verwaltet werden, während die vom Benutzer vertrauenswürdigen Zertifikate dort im Abschnitt "Benutzer" verwaltet werden. Bei Verwendung von vertrauenswürdigen Benutzerzertifikaten zwingt Android den Benutzer des Android-Geräts, zusätzliche Sicherheitsmaßnahmen zu implementieren: Die Verwendung eines PIN-Codes, einer Mustersperre oder eines Kennworts zum Entsperren des Geräts ist obligatorisch, 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 Root-Zugriff), hat jedoch den Vorteil, dass die Android-Sperrbildschirmanforderung vermieden wird.

Ab Android N wird es etwas schwieriger, siehe diesen Auszug von 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 steuern.

Um Ihre App so zu konfigurieren, dass sie Charles vertraut, müssen Sie Ihrer App eine Netzwerksicherheits-Konfigurationsdatei hinzufügen. Diese Datei kann den Systemstandard überschreiben und es Ihrer App ermöglichen, vom Benutzer installierten CA-Zertifikaten (z. B. dem Charles Root-Zertifikat) zu vertrauen. Sie können angeben, dass dies nur in Debug-Builds Ihrer Anwendung gilt, sodass Produktions-Builds das Standard-Vertrauensprofil verwenden.

Fügen Sie Ihrer App eine 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>
Dean Wild
quelle
1
Meine benutzerdefinierten Zertifikatdateien ( /system/etc/security/cacerts/*.0) werden nach dem Neustart / Neustart von AVD nicht beibehalten, sodass diese Lösung nicht erfolgreich war.
fikr4n
@BornToCode interessant - Ich benutze selten AVDs, daher war mir diese Einschränkung nicht bewusst
Dean Wild
Ich sehe die Einstellung debug-overrides, bedeutet das, dass diese network_security_confignur auf Debug-Variante abzielt? Wenn ich eine andere Variante wie die UAT-Variante habe, funktioniert diese dann nicht?
Isaac
1
@Isaac dies bedeutet, dass es für alle Varianten gilt, bei denen debuggable = true
Dean Wild
1
@ DeanWild - vielen Dank! Ich habe versucht, dies für immer zum Laufen zu bringen und habe beim Debuggen meiner App immer wieder ein "ungültiges SSL-Zertifikat" erhalten. Diese Lösung funktionierte wie ein Zauber für meine Android-App, die auf Android 9 auf einem Samsung Note 8 ausgeführt wird.
Dave Black
43

Ich habe viel Zeit damit verbracht, eine Antwort darauf zu finden (ich brauche Android, um StartSSL-Zertifikate zu sehen). Fazit: Mit Android 2.1 und 2.2 können Sie Zertifikate importieren, jedoch nur zur Verwendung mit WiFi und VPN. Es gibt keine Benutzeroberfläche zum Aktualisieren der Liste der vertrauenswürdigen Stammzertifikate, es wird jedoch über das Hinzufügen dieser Funktion diskutiert. Es ist unklar, ob es eine zuverlässige Problemumgehung für das manuelle Aktualisieren und Ersetzen der Datei cacerts.bks gibt.

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

Mark Berry
quelle
3
Ein Android-Entwickler hat meine Anfrage bezüglich beantwortet. Aktualisieren von cacerts.bks: "In allen Versionen bis 2.3 ist ein OTA erforderlich, um die cacerts.bks auf einem nicht gerooteten Telefon zu aktualisieren." code.google.com/p/android/issues/detail?id=11231#c25 . OTA = über Funk, richtig? Könnte dies der Grund sein, warum Ihr Telefon immer wieder auf die Werkseinstellungen cacerts.bks zurückgreift? Wenn Sie jedoch Root-Zugriff haben, sollten Sie anscheinend in der Lage sein, den Quellcode herunterzuladen, Ihr Zertifikat hinzuzufügen und dann cacerts.bks mit dem Skript certimport.sh zu erstellen. android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Mark Berry
Vielen Dank. Dies war offensichtlich nicht die Antwort, die ich hören wollte, aber sie scheint die richtige zu sein. Ich hoffte, dass es eine Möglichkeit gab, ein Zertifikat zu installieren, ohne das gesamte System zu aktualisieren. Ich kann natürlich die neue cacerts.bks erstellen, mit Root-Zugriff kann ich sogar die alte ersetzen, aber bei jedem Neustart wird die ursprüngliche Version wiederhergestellt. Ohne Neustart scheint Android sich zu weigern, die vertrauenswürdige Zertifikatsdatei neu zu laden.
Björn Marschollek
27
Was ist mit der Installation von CA-Zertifikaten auf 3.X- und 4.X-Plattformen?
Alok Kulkarni
16

Wenn Sie Ihr Zertifikat für HTTPS-Verbindungen benötigen, können Sie die .bks-Datei als Rohressource zu Ihrer Anwendung 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);
        }
    }
}
Alexander Egger
quelle
Danke für deine Antwort. Eigentlich muss ich das Zertifikat so installieren, dass jede Anwendung auf dem Gerät dem Zertifikat vertraut. Das gleiche Problem sollte auch für einige kleinere Zertifizierungsstellen wie CAcert bestehen, deren Zertifikate standardmäßig nicht vertrauenswürdig sind. Wie bekommen sie ihre Zertifikate installiert?
Björn Marschollek
Haben Sie versucht: Einstellungen -> Sicherheit -> Von SD-Karte installieren
Alexander Egger
Auch das könnte interessant sein: android.git.kernel.org/?p=platform/packages/apps/…
Alexander Egger
2
Ich habe das gleiche Problem, ich muss ein .PDX X509-Zertifikat mit der Adroid 2.3.3-Anwendung laden und dann eine SSL-Verbindung erstellen. Kann mir jemand mit kommentiertem Code helfen?
AndroidLearner
9

Die hier verlinkte Anleitung 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 CA-Zertifikate auf verschiedenen Versionen von Android-Geräten (unter anderem) führt.

Grundsätzlich müssen Sie:

  1. Download: die Datei cacerts.bks von Ihrem Telefon.

    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 mithilfe des BouncyCastle-Anbieters

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

Hier finden Sie eine ausführlichere Schritt-für-Schritt-Anleitung zum Aktualisieren früherer Android-Telefone: So aktualisieren Sie den Keystore der HTTPS-Sicherheitszertifizierungsstelle auf Geräten vor Android 4.0

RightHandedMonkey
quelle
5

Es gibt eine VIEL einfachere Lösung dafür als hier oder in verwandten Themen. 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 versteckte zu diesem Zweck erstellen. Hier ist eine Funktion, die in nahezu jedem Browser (oder in jeder Webansicht) funktioniert, um die Installation zu starten (im Allgemeinen über das gemeinsam genutzte OS-Zertifikat-Repository, einschließlich auf einem Droid). Es verwendet einen schönen Trick mit iFrames. Übergeben Sie einfach die URL an eine 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 auf Droids mit API 19 und höher, ältere Versionen der Webansicht funktionieren jedoch nicht so. Die allgemeine Idee funktioniert jedoch immer noch - laden Sie einfach die Datei mit einer Webansicht herunter / öffnen Sie sie und lassen Sie das Betriebssystem übernehmen. Dies kann eine einfachere und universellere Lösung sein (im aktuellen Java jetzt):

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

Beachten Sie, dass instance_ ein Verweis auf die Aktivität ist. Dies funktioniert perfekt, wenn Sie die URL zum Zertifikat 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 dies auf eine Weise aufzurufen, die keinen Absturz aufgrund einer Threading-Komplikation verursachte, aber ich werde hier nicht all diese Verwirrung hinzufügen ...

BuvinJ
quelle
3

Was ich getan habe, um Startssl-Zertifikate zu verwenden, war ziemlich 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/sub.class1.server.ca.crt

Ging zu portecle.sourceforge.net und führte portecle direkt von der Webseite aus.

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

Wählen Sie Import in Portacle und öffnen Sie sub.class1.server.ca.crt. In meinem Fall hatte es bereits die ca.crt, aber vielleicht müssen Sie das auch installieren.

Der Keystore wurde gespeichert und baxck in /system/etc/security/cacerts.bks kopiert (ich habe zuerst für alle Fälle eine Sicherungskopie dieser Datei erstellt).

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

Hans
quelle
Haben Sie eine Idee, wie Sie die Datei cacert.bks wieder auf einem nicht gerooteten Gerät ablegen können?
Bob
1

Diese Schritte haben bei mir funktioniert:

  1. Installieren Sie die Dory Certificate Android-App auf Ihrem Mobilgerät: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=de_DE
  2. Verbinden Sie das mobile Gerät mit einem USB-Kabel mit dem Laptop.
  3. Erstellen Sie einen Stammordner im internen Telefonspeicher, kopieren Sie die Zertifikatdatei in diesen Ordner und trennen Sie das Kabel.
  4. Öffnen Sie die Android-App für Dory-Zertifikate, klicken Sie auf die runde Schaltfläche [+] und wählen Sie die richtige Option zum Importieren von Dateizertifikaten.
  5. Wählen Sie das Format aus, geben Sie einen Namen ein (ich habe den gleichen Dateinamen eingegeben), durchsuchen Sie die Zertifikatdatei und klicken Sie auf [OK].
  6. Es werden drei Karten aufgelistet. Ich ignorierte die Karte, die nur die Schaltfläche [CSR SIGNIEREN] hatte, und klickte auf die Schaltfläche [INSTALLIEREN] der beiden anderen Karten.
  7. Ich habe die PWA-Web-App aktualisiert, die ich ohne mein mobiles Chrome (es wird auf einem lokalen IIS-Webserver gehostet) und voala geöffnet habe! Keine Chrom-Warnmeldung. Das grüne Schloss war da. Es hat funktioniert.

Alternativ fand ich diese Optionen, die ich nicht selbst ausprobieren musste, die aber leicht zu befolgen waren:

Schließlich ist dies möglicherweise nicht relevant. Wenn Sie jedoch ein selbstsigniertes Zertifikat (mit mkcert) für Ihre PWA-App (Website) erstellen und einrichten möchten, die auf einem lokalen IIS-Webserver gehostet wird, habe ich diese Seite befolgt:

https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

Danke und hoffe es hilft !! :) :)

Manuel Hernandez
quelle
0

Hier ist eine alternative Lösung, mit der Ihr Zertifikat tatsächlich zur integrierten Liste der Standardzertifikate hinzugefügt wird: Vertrauen aller Zertifikate mithilfe von HttpClient über HTTPS

Es 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.

emmby
quelle