Je viens de faire l\’acquisition d\’un Open C de ZTE sous Firefox OS. Après une première étape consistant à rooter le téléphone et à le passer sous Firefox OS 2.1 (qui est très stable), je me suis lancé dans la configuration de mon compte mail Aquilenet (Fournisseur d\’accès à Internet Associatif en Gironde). Seulement voilà… les certificats de sécurité d\’Aquilenet sont signés par CACert. Or, cette autorité de certification n\’est pas \ »de confiance\ ». On pourrait débattre des heures sur la stupidité de ce système d\’autorité de confiance mais ce n\’est pas le propos
Toujours est-il que Firefox OS 2.1 ne permet pas de configurer de compte mail si l\’autorité de certification n\’est pas dans sa liste blanche. La solution ? Ajouter CACert à la main dans cette liste ! Pour ce faire, il existe un \ »tuto\ » qui est proposé en premier résultat lorsqu\’on cherche sur le web à résoudre ce problème. Sauf que ce tutoriel consiste en l\’exécution d\’un script sans la moindre documentation. Après lecture, le script est certes tout à fait sûr mais il manque pas mal d\’informations pour le faire fonctionner. Je me propose donc de vous expliquer tout ça un peu plus en détail. Ce billet est donc directement inspiré du tutoriel en question.
Que va-t-on faire ?
Le principe est simple. Grâce à l\’outil adb, nous allons rapatrier la base de données des certificats de confiance de Firefox OS. Nous allons ensuite y ajouter le certificat de CACert grâce à un petit programme appelé certutil. Enfin, nous allons gentiment reposer cette base de donnée comme si de rien n\’était.
Les pré-requis
Je pars du principe que votre Open C est rooté.
Concernant le téléphone, il faut que le mode \ »débogage\ » soit activé. Vous pouvez le faire de la façon suivante : Paramètres > Développeurs > Débogage USB > ADB Uniquement
Sous Debian, il suffit d\’installer le deux paquets suivant, fournissant respectivement les outils adb et certutil :
$ apt-get install android-tools-adb libnss3-tools
Let\’s hack !
On va commencer par brancher le téléphone en USB et vérifier qu\’il est bien détecté par adb.
$ adb devices
List of devices attached
1a1b5c9 device
À partir de là, vous devriez être capable de vous connecter au téléphone. Un \ »adb connect <id_device>\ » est peut-être nécessaire si ce n\’est pas le cas. Pour vous connecter et obtenir une session :
$ adb shell
root@ZTE_P821A10:/ #
C\’est déjà un bon début ! L\’étape suivante consiste à récupérer le nom du dossier contenant la base de données des certificats. Ce dossier a un nom se terminant par \ ».default\ » et se situe dans \ »/data/b2g/mozilla\ ».
root@ZTE_P821A10:/data # cd /data/b2g/mozilla/
root@ZTE_P821A10:/data/b2g/mozilla # ls -d *.default
hyyegklw.default
L\’emplacement de la base de données dont nous avons besoin est donc chez moi : \ »/data/b2g/mozilla/hyyegklw.default\ ». Vous pouvez alors faire un petit \ »exit\ » pour quitter la session sur le téléphone. Nous n\’utiliserons désormais plus de session interactive.
Les trois fichiers qu\’il nous faut récupérer maintenant sont les suivants : cert9.db, key4.db et pkcs11.txt. L\’idéal est de les récupérer dans un dossier réservé à cette manipulation et que nous pourrons supprimer à la fin de la procédure. Les commandes adb sont alors :
$ adb pull /data/b2g/mozilla/hyyegklw.default/cert9.db
$ adb pull /data/b2g/mozilla/hyyegklw.default/key4.db
$ adb pull /data/b2g/mozilla/hyyegklw.default/pkcs11.txt
Dans ce même dossier, nous allons maintenant créer un dossier \ »certs\ » dans lequel nous allons mettre la clé du certificat racine de classe 3 de CACert au format PEM. Cette clé est disponible ici : http://www.cacert.org/certs/class3.crt
Revenons maintenant dans le dossier contenant les fichiers de base de donnée. Nous allons utiliser l\’outil certutil pour ajouter une entrée pour CACert dans cette base. Une première commande permet de lister les autorités présentes dans cette liste blanche :
$ certutil -d \'sql:.\' -L
Certificate Nickname Trust Attributes
SSL,S/MIME,JAR/XPI
DigiCert SHA2 Extended Validation Server CA ,,
VeriSign Class 3 Secure Server CA - G3 ,,
GeoTrust SSL CA - G3 ,,
GeoTrust Global CA ,,
DigiCert High Assurance CA-3 ,,
Google Internet Authority G2 ,,
Symantec Class 3 EV SSL CA - G3 ,,
DigiCert SHA2 High Assurance Server CA ,,
DigiCert SHA2 Secure Server CA ,,
GeoTrust SSL CA ,,
TERENA SSL CA ,,
UTN-USERFirst-Hardware ,,
GeoTrust SSL CA - G2 ,,
GlobalSign Organization Validation CA - SHA256 - G2 ,,
DigiCert High Assurance EV CA-1 ,,
L\’option \ »-d \’sql:.\’ permet de dire à certutil quelle base de donnée interroger. En l\’occurrence il s\’agit de celle présente dans \ ».\ », soit le dossier courant. Nous allons à présent redéfinir un mot de passe vide pour cette base de données afin de pouvoir la modifier.
$ certutil -d \'sql:.\' -N --empty-password
Ajoutons maintenant la clé de CACert !
$ certutil -d \'sql:.\' -A -n \"class3.crt\" -t \"C,C,TC\" -i certs/class3.crt
$ certutil -d \'sql:.\' -L
Certificate Nickname Trust Attributes
SSL,S/MIME,JAR/XPI
DigiCert SHA2 Extended Validation Server CA ,,
VeriSign Class 3 Secure Server CA - G3 ,,
GeoTrust SSL CA - G3 ,,
GeoTrust Global CA ,,
DigiCert High Assurance CA-3 ,,
Google Internet Authority G2 ,,
Symantec Class 3 EV SSL CA - G3 ,,
DigiCert SHA2 High Assurance Server CA ,,
DigiCert SHA2 Secure Server CA ,,
GeoTrust SSL CA ,,
TERENA SSL CA ,,
UTN-USERFirst-Hardware ,,
GeoTrust SSL CA - G2 ,,
GlobalSign Organization Validation CA - SHA256 - G2 ,,
DigiCert High Assurance EV CA-1 ,,
class3.crt C,C,C
Détaillons un peu cette commande : l\’option \ »-A\ » signifie que nous voulons ajouter une entrée dans la base de données. À l\’inverse, l\’utilisation de \ »-D\ » supprimera une entrée. L\’option \ »-n \ »class3.crt\ »\ » permet de nommer cette entrée tandis que \ »-i certs/class3.crt\ » donne le chemin du certificat. Enfin, l\’option \ »-t \ »C,C,TC\ »\ » définit la confiance qu\’on souhaite accorder à ce certificat. La documentation de certutil l\’explique de cette façon :
-t trustargs Set the certificate trust attributes: trustargs is of the form x,y,z where x is for SSL, y is for S/MIME, and z is for code signing. Use ,, for no explicit trust. p prohibited (explicitly distrusted) P trusted peer c valid CA T trusted CA to issue client certs (implies c) C trusted CA to issue server certs (implies c) u user cert w send warning g make step-up cert
Une information importante ici : les arguments que je vous propose sont ceux utilisés sur le tutoriel évoqué précédemment. À la lecture du manuel, ils me semblent tout à fait raisonnables et rendent l\’utilisation de ma boite mail fonctionnelle. Ceci dit, il serait intéressant de creuser la question pour bien comprendre ce que tout ça implique. Vu que, je vous le rappelle, il est question de faire confiance à quelqu\’un pour une couche de sécurité…
Bref, la base de données est augmentée du certificat dont nous avons besoin. Il ne reste plus qu\’à remettre tout ça en place ! Mais avant tout, nous allons tuer le processus b2g que nous allons relancer une fois la base de données mise à jour sur le téléphone. Cette étape permet de prendre en compte cette modification sans procéder à un hard reboot.
$ adb shell stop b2g
$ adb push cert9.db /data/b2g/mozilla/hyyegklw.default/cert9.db
$ adb push key4.db /data/b2g/mozilla/hyyegklw.default/key4.db
$ adb push pkcs11.txt /data/b2g/mozilla/hyyegklw.default/pkcs11.txt
$ adb shell start b2g
Et voilà ! Le tour est joué ! Vous devriez dorénavant pouvoir configurer le client mail avec un serveur dont le certificat de sécurité est fourni par CACert.