Android ein eigenes SSL-Zertifikat unterschieben

An dem Zusatz
An dem Zusatz „Extensions“ samt „Basic Constraints“-Erweiterung erkennt man ein CA-Zertifikat, wie es Android mag (Ansicht aus dem Firefox-Browser)

Selbstsignierte SSL-Zertifikate genügen vollkommen, um die Kommunikation mit privat genutzten Diensten, beispielsweise einem Owncloud-Server, übers Internet abzusichern. Auf diese Weise lassen sich auf dem eigenen Smartphone auch Kalender und Adressbuch abgleichen. Dummerweise akzeptiert Googles Betriebssystem ein typisches selbstsigniertes SSL-Zertrifikat nicht; wie es trotzdem geht und welche Apps man für die Installation des Zertifikats sowie die Synchronisation mit den von Haus aus in Android nicht unterstützten Datenaustausch-Protokollen CalDAV (Termine) und CardDAV (Adressen) verwenden kann, steht in diesem Posting.

Android ist nicht nur sehr wählerisch beim Import von SSL-Zertifikaten – Google selbst dokumentiert das Verfahren auch noch mies. Die einzige Ressource aus Anwendersicht, die sich – per Google-Suche 🙂 – problemlos auffinden ließ, ist das Support-Dokument Zertifikate verwenden auf den Hilfe-Seiten für Googles Nexus-Geräte, das „für Android 4.3 oder höher“ gilt. Demnach müssen Zertifikatsdateien im DER-Format kodiert sein und mit der Dateiendung *.crt oder *.cer gespeichert werden, damit sie installiert werden können.

Diese Bedingungen erfüllt auch das hier im Blog geschilderte Verfahren, sich ein selbst signiertes Zertifikat zu erstellen. Dennoch zickt Android damit herum – selbst wenn das Betriebssystem beim Importieren keine Fehlermeldung auswirft. Wie es statt dessen geht, diese Information findet sich allerdings nicht auf Googles Hilfeseiten, sondern in der IBM Knowledge Base: Zufrieden ist Android nämlich erst, wird es statt mit einem simplen selbst-signierten Zertifikat mit einem selbst-signierten CA-Zertifikat gefüttert. Anders gesagt: Man befördert sich selbst zur Certificate Authority und signiert am Ende dieses Root-Zertifikat doch wieder selbst. Ein Fall von Amtsanmaßung also.

Der folgende Einzeiler erzeugt mit openssl ein solches Zertifikat samt privatem Schlüssel:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out example.com.crt -reqexts v3_req -extensions v3_ca

Openssl erzeugt hier einen privaten Schlüssel ohne Passphrase (Parameter -nodes) und ein Zertifikat mit Unterstützung für Extensions (Parameter -reqexts v3_req), wo in der Erweiterung „Basic Constraints“ das CA-Flag (Parameter -extensions v3_ca) gesetzt ist. Alle anderen Parameter kennen wir schon von der Erzeugung eines selbst signierten Zertifikats.

Schlüssel und Zertifikat lädt man dann auf seinen Web-Server; wie man Apache und Nginx für SSL-Verbindungen empfänglich macht, habe ich bereits beschrieben.

Damit Android nun das Zertifikat auf dem Smartphone installiert, genügt es nicht, die Website mit dem Browser zu besuchen. Statt dessen muss man die Zertifikatsdatei auf das Smartphone laden (zum Beispiel via SD-Karte) und von Hand installieren. Oder aber man nutzt die App CAdroid, die den Nutzer nicht nur durch die Installation führt, sondern auch das Zertifikat selbst herunterlädt und prüft. Ist alles okay, kann man es über das Menü Einstellungen > Sicherheit > von Telefonspeicher installieren. Das installierte Zertifikat erscheint dann unter vertrauenswürdige Anmeldedaten > Nutzer.

Eine Android-typische Nerverei kann allerdings auch CAdroid nicht umschiffen: Android Kitkat stellt nämlich nach der Installation (die erst möglich ist, wenn ein PIN-Code für das Smartphone eingerichtet wurde) regelmäßig Warnungen in die MItteilungsleiste, dass das Netzwerk möglicherweise abgehört wird („Network may be monitored“). Nein, damit ist nicht die NSA gemeint, sondern unser unschuldiges Selfmade-CA-Zertifikat. Abstellen lässt sich dieser Fehlalarm nicht.

CAdroid findet man übrigens nicht nur in Googles Play Store, sondern auch in dem Open-Source-App-Store F-Droid. Das gilt auch für die App DavDroid, die sowohl den Datenaustausch via CalDav als auch CardDav beherrscht. Auf diese Weise lassen sich Kalender und Adressbuch auch mit anderen Providern als mit Google synchronisieren, zum Beispiel mit einem eigenen Owncloud-Server. Die Owncloud-App findet sich ebenfalls bei F-Droid; sie ermöglicht allerdings nur die Synchronisation von Dateien, nicht der ebenfalls in der Owncloud bereitgehaltenen Termine und Adressen.

Wer will, kann also auf Googles Dienste komplett verzichten und braucht auch keine Dropbox mehr. Da alle Apps bei F-Droid kostenlos erhältlich sind, sollte man aber nicht vergessen, den Entwicklern eine Spende zukommen zu lassen.

4 comments on “Android ein eigenes SSL-Zertifikat unterschieben”

  1. Hatte auch eben mit dem CA-Flag Meldung von CA-Droid zu kämpfen. Jetzt kommt die Meldung nicht mehr. 🙂
    Ist es hier vielleicht sicherheitstechnisch von Nachteil, dass die Pfadlänge unter Basic Constrains Erweiterung auf unendlich steht und bei Zertifikat ein extra Passwort festgelegt wurde?

  2. @kk: Pfadlänge unendlich – das bedeutet, dass jemand anders mein Zertifikat hernehmen und damit weitere Intermediate Certificates erstellen könnte, und zwar unendlich viele in der Zertifikatskette. Wäre tatsächlich ein Skandal, wenn Verisign das machen würde. Bei meinem Zertifikat ist es jedoch egal, da ihm sowieso niemand traut und kein Browser es kennt.

    Zertifikat mit extra Passwort : Ein zusätzliches Passwort macht die Sache natürlich immer sicherer. Nur setzt das eben voraus, dass ein Passwort auch abgefragt wird, und dann müsste es der Webserver auch bei jedem Neustart beantworten.

  3. Thank you. I lost 8 hours trying to solve this. You’re the only one who got a solution that works. THANKS!!

Schreibe einen Kommentar