root-Zertifikate von CAcert in Android importieren

Importieren ist beschönigend ausgedrückt, ich hab die Zertifikate dem Telefon eigentlich eher aufgedrängt… Da es etwas gedauert hat, überhaupt herauszufinden, wie das geht, hier ein paar Zeilen dazu: Es geht um das Samsung Galaxy S (GT i-9000), in Verbindung mit einem Ubuntu-Rechner. root-Rechte auf dem Telefon sind Voraussetzung!

[Update 2: Interessant ist auch die neue (noch alpha-) App CACertMan vom Guardian Project [4], die es erlaubt, die CAs zu verwalten. Das Projekt stellt alternativ auch eine Datei zur Verfügung, aus der zwei CAs entfernt wurden (DigiNotar und die chinesische CNNIC).]

[Update 3 (28.04.2012): Unter Android 4.0.x/Cyanogenmod9 ist alles viel schöner! Einfach die Zertifikate auf die SD-Karte kopieren, dann bei Einstellungen -> Sicherheit -> den Punkt „Von SD-Karte installieren“ anklicken, die Dateien auswählen, fertig. Welchen Zertifikaten das Telefon vertraut, ist hier auch viel einfacher einzusehen, nämlich bei Einstellungen -> Sicherheit -> „Vertrauensw. Anmeldedaten“. Dort kann man im Reiter „System“ vorinstallierte Zertifikate abwählen und im Reiter „Nutzer“_in die selbst installierten sehen.]

Die Vorlage hatte ich aus dem CAcert-Wiki [1], zusätzlich eine Anleitung von developer.android.com [2], um das Android SDK auf dem Rechner zu installieren. [Update: Es geht auch ohne Android SDK, direkt im Terminal auf dem Telefon, dazu siehe unten!] In dem Android SDK muss mensch noch die plattform-tools installieren (wegen des schicken Programms adb, das gleich auf die Bühne tritt). USB-Verbindung herstellen, und zwar mit USB-Debugging an, also unter Einstellungen -> Anwendungen -> Entwicklung das Häkchen setzen. Mit lsusb -v die Vendor-ID vom Handy nachsehen:

userin@rechner:~$ lsusb -v
## suchen nach Telefon und dann nach dieser Zeile
idVendor 0x04e8 Samsung Electronics Co., Ltd
## den Teil 04e8 kopieren/merken 😉

Eine udev-Regel erstellen (Dank nach hier [3]): Dazu in /etc/udev/rules.d/ eine Datei namens 50-android.rules mit dem Inhalt

SUBSYSTEM==“usb“, SYSFS{idVendor}==“04e8″, MODE=“0666″, OWNER=“user“

(also bei „user“ dann auf Euer Login ändern) erstellen. Schauen, was geht, und tatsächlich:

userin@rechner:~$ adb devices
List of devices attached
100051264dd9 device

Jetzt zurück zum CAcert-Wiki: Die ersten Schritte funktionieren auf dem Galaxy S genau so:
Die drei dort angegebenen Dateien auf den Rechner laden ($JAVA_HOME/jre/lib/ext/ ist bei mir /usr/lib/jvm/java-6-openjdk/jre/lib/ext).

root@rechner:/usr/lib/jvm/java-6-openjdk/jre/lib/ext# wget http://bouncycastle.org/download/bcprov-jdk16-141.jar

userin@rechner:~$ wget http://www.cacert.org/certs/root.crt
userin@rechner:~$ wget http://www.cacert.org/certs/class3.crt

## bisherige Zertifikatsdatei vom Handy holen:
userin@rechner:~$ adb pull /system/etc/security/cacerts.bks cacerts.bks

## root-Zertifikate in diese Datei importieren:
userin@rechner:~$ keytool -keystore cacerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass changeit -importcert -trustcacerts -alias CACERT -file root.crt
userin@rechner:~$ keytool -keystore cacerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass changeit -importcert -trustcacerts -alias CACERT3 -file class3.crt

## Test:
userin@rechner:~$ keytool -keystore cacerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass changeit -v -list | grep -i cacert
Aliasname: CACERT3
Eigner: O=CAcert Inc.,OU=http://www.CAcert.org,CN=CAcert Class 3 Root
Aussteller: O=Root CA,OU=http://www.cacert.org,CN=CA Cert Signing Authority,E=support@cacert.org
Aliasname: CACERT
Eigner: O=Root CA,OU=http://www.cacert.org,CN=CA Cert Signing Authority,E=support@cacert.org
Aussteller: O=Root CA,OU=http://www.cacert.org,CN=CA Cert Signing Authority,E=support@cacert.org

Dann das Problem: Der Rücktransfer dieser Datei cacerts.bks auf das Telefon hat nicht so funktioniert, immer kamen Beschwerden über die Befehlssyntax. Dazu meldete mein Telefon auch, dass ich nicht genug Rechte hätte, wenn ich als userin mit „adb shell bla“ auf das Telefon zugreifen wollte, obwohl es im Wiki ganz danach aussieht.
Ich hab es dann nach einigem Rumlesen so gemacht:
[Update: Mit mount (oder adb shell mount kann mensch nachsehen, wie die /system-Partition eingebunden ist, und was sie überhaupt für ein Dateisystem nutzt. Dabei gibt es Unterschiede. Beim mitgelieferten Android (2.2) ging es wie folgt. Bei cyanogenmod 7.1.0-RC1-GalaxyS dagegen funktioniert die mount-Syntax aus dem CAcert-Wiki!]

## Die Datei erstmal auf die SD-Karte verfrachten:
userin@rechner:~$ adb push cacerts.bks /mnt/sdcard/

## Um /system mit Lese- und Schreibrechte zu mounten, brauchte ich mehrere Schritte und eine andere Syntax:
userin@rechner:~$ adb shell
$ su (hier dann auf dem Handy root-Rechte gewähren)
# mount -o rw,remount -t rfs /dev/block/stl9 /system
# cat /mnt/sdcard/cacerts.bks > /system/etc/security/cacerts.bks
# mount -o ro,remount -t rfs /dev/block/stl9 /system

Telefon neustarten und https://www.cacert.org aufrufen. Da gibt’s jetzt keine Fehlermeldung mehr, sondern ein schickes Schloss. Mission accomplished, scheint’s.

CAcert-Zertifikat in Android
CAcert-Zertifikat in Android

[Update: Wer kein Android SDK installiert hat, braucht dies nicht unbedingt, sondern das Ganze funktioniert auch mit dem Android Terminal Emulator, z. B. so:

cp /system/etc/security/cacerts.bks /sdcard/

  • die Datei von der SD-Karte auf den Rechner bringen
  • die Datei cacerts.bks wie oben beschrieben bearbeiten und sie wieder auf die SD-Karte kopieren
  • im Terminal Emulator auf dem Galaxy root werden und dann die obigen Befehle mit remount,rw nach /system/etc/security/cacerts.bks kopieren, remount,ro direkt dort ausführen.
  • Telefon neustarten]

 

[1] http://wiki.cacert.org/FAQ/ImportRootCert?action=show&redirect=ImportRootCert#Android_Phones

[2] http://developer.android.com/sdk/installing.html#

[3] http://www.androidwiki.de/howto-linux-adb-fastboot-mass-storage.html

[4] https://guardianproject.info/2011/09/05/cacertman-app-to-address-diginotar-other-bad-cas/

Eine Antwort zu „root-Zertifikate von CAcert in Android importieren“

  1. Vielen Dank für die Copy-Paste-Anleitung.

    Ein kleines Problem unter Ubuntu: Obwohl JAVA_HOME=/usr/lib/jvm/java-6-openjdk/ musste die BouncyCastle-Library in /usr/lib/jvm/java-6-sun/jre/lib/ext kopiert werden.