Passbolt + Android-App

Wenn Sie Passbolt, einen selbst hostbaren (und in der „Community Edition“ kostenlosen) Passwortmanager nutzen und darauf von Ihrem Android-Handy zugreifen möchten, gibt es ein paar Fallstricke. Besonders bezüglich der Erstellung der benötigten Zertifikate.

 

Die generelle Installationsanleitung wie man Zertifikate anlegt:

https://help.passbolt.com/configure/https/ce/debian/manual

 

Und eine Anleitung wie man diese in Android importiert:

https://help.passbolt.com/faq/hosting/how-to-import-ssl-certificate-on-mobile

 

Leider schlägt dies kapital fehl! Zumindest mit Geräten ab Android 11.

 

Problematik:

Hat man die Passbolt-App aus dem Google-Store installiert, muss man sich damit am Passbolt-System anmelden. Dies wird mittels mehrerer, hintereinander generiert QR-Codes gemacht.

Dies schlägt erstmalig fehl, weil man das selbst signierte Zertifikat nirgends als „Ausnahme“ (wie in normalen Browsern) deklarieren kann.

Der zweite Schritt wäre, das Zertifikat (das basierend auf der Passbolt-Anleitung erstellt wurde) in Android als CA zu hinterlegen. Importiert man das, schlägt dies fehl, weil ein „End-Entitäten“-Zertifikat nicht als CA nutzbar ist.

Der nächste Schritt wäre, eine CA zu erstellen, dann das Zertifikat für den Server und dieses von der CA signieren zu lassen. Importiert man dieses CA-Zertifikat in Android, schlägt dies fehl, weil Android den „Privaten Schlüssel“ verlangt.

Erstellt man nun eine Datei die beides enthält – ein p12-Datei – und importiert diese, schlägt dies fehl, weil der „CA-Flag“ fehlt.

Fügt man den CA-Flag nun ein und exportiert das Ganze, schlägt es jetzt fehl, weil der SAN nicht als DNS sondern als IP deklariert werden muss (dieser Hinweis fehlt gänzlich in der Passbolt-Anleitung).

Generiert man wieder alles, schlägt es erneut fehl, weil die Key Usage Erweiterungen fehlen.

Der ganze Prozess ist sehr langatmig und kompliziert, weil die Fehler in der App auch nicht deutlich angezeigt werden. Man muss sich das über das Debug-Protokoll und teilweise nachgestellt in Browsern, zusammenreimen.

 

Lösung des Problems

Nach längerem Experimentieren, habe ich mit folgenden Schritten eine erfolgreiche Anmeldung (mit der Android-App) am Passbolt-System bewerkstelligen können. Die Schritte gehen davon aus, dass sich CA und Passbolt-Server auf dem gleichen System befinden.

Eine Konfigurationsdatei für die CA-erstellen:

sudo nano openssl-ca.cnf

 

Darin folgendes einfügen (Angaben an die eigene Umgebung anpassen!):

[ req ]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn

[ dn ]
C = DE
ST = BY
L = GAP
O = meine Organisation
OU = IT
CN = Passbolt CA
emailAddress = mail@meine.tld

[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, cRLSign, keyCertSign

 

CA generieren (hier beträgt die Gültigkeit 10 Jahre (3650 Tage), dies kann angepasst werden):

sudo openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3650 -nodes -extensions v3_ca -config openssl-ca.cnf

 

Eine Konfigurationsdatei für den Server (Passbolt) erstellen:

sudo nano openssl-srv.cnf

 

Darin folgendes einfügen (Angaben an die eigene Umgebung anpassen, besonders die IP des Servers unter CN und IP.1!):

[ req ]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext

[ dn ]
C = DE
ST = BY
L = GAP
O = meine Organisation
OU = IT
CN = 1.2.3.4
emailAddress = mail@meine.tld


[ req_ext ]
subjectAltName = @alt_names
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[ alt_names ]
IP.1 = 1.2.3.4

 

CSR und privaten Schlüssel für den Passbolt-Server erstellen:

sudo openssl req -new -newkey rsa:4096 -keyout passbolt.key -out passbolt.csr -config openssl-srv.cnf -nodes

 

CSR nun mittels der CA signieren (Gültigkeit beträgt wieder 10 Jahre, kann angepasst werden):

sudo openssl x509 -req -in passbolt.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out passbolt.crt -days 3650 -extensions req_ext -extfile openssl-srv.cnf

 

Hat man das durchlaufen, hat man folgende Dateien:

  • ca.crt (öffentlicher Schlüssel der CA – muss auf Android importiert werden!)
  • ca.key (privater Schlüssel der CA)
  • passbolt.crt (öffentlicher Schlüssel des Passbolt-Servers, signiert von der CA)
  • passbolt.key (privater Schlüssel des Passbolt-Servers)
  • passbolt.csr (Certificate Signing Request Datei – wird nicht mehr benötigt)
  • openssl-ca.cnf (Konfigurationsdatei für openssl, für die CA – kann aufgehoben werden)
  • openssl-srv.cnf (Konfigurationsdatei für openssl, für den Passbolt-Server – kann aufgehoben werden)

Die openssl-ca.cnf und openssl-srv.cnf wird nicht mehr benötigt, kann aber aufgehoben werden falls es Änderungen gibt und man das Ganze nochmals durchlaufen muss. Die passbolt.csr wird nicht mehr benötigt.

 

DNS statt IP

Nutzen Sie statt einer IP einen DNS-Namen, müssen die folgendes anpassen:

Geben Sie den DNS-Namen als „Common Name“ in der openssl-srv.cnf an:

CN = ihrserver.domain.com

DNS-Namen in der Konfigurationsdatei hinzufügen:

In der openssl-srv.cnf Datei, unter [alt_names], fügen Sie den DNS-Namen hinzu:

DNS.1 = ihrserver.domain.com

Wenn Sie mehrere DNS-Namen oder IP-Adressen haben, fahren Sie damit fort sie in aufsteigender Reihenfolge hinzuzufügen:

DNS.2 = www.ihrserver.domain.com
IP.1 = 1.2.3.4

Beispiel:

[ alt_names ]
DNS.1 = ihrserver.domain.com
DNS.2 = www.ihrserver.domain.com
IP.1 = 1.2.3.4

 

Erklärungen Key Usages:

In der openssl-ca.cnf:

  • subjectKeyIdentifier = hash: Erzeugt einen eindeutigen Identifier für den öffentlichen Schlüssel im Zertifikat.
  • authorityKeyIdentifier = keyid:always,issuer: Identifiziert den öffentlichen Schlüssel, der zum Signieren des Zertifikats verwendet wird.
  • basicConstraints = critical, CA:true: Dies ist ein kritischer Eintrag, der angibt, dass dieses Zertifikat als CA verwendet werden kann. „CA:true“ bedeutet, dass dieses Zertifikat andere Zertifikate signieren kann.
  • keyUsage = critical, cRLSign, keyCertSign: Dies ist auch ein kritischer Eintrag. cRLSign erlaubt dem Zertifikat, eine Zertifikatsperrliste (CRL) zu signieren. keyCertSign erlaubt dem Zertifikat, andere Zertifikate zu signieren.

 

In der openssl-srv.cnf:

  • subjectAltName = @alt_names: Gibt an, dass die SAN-Informationen aus dem Abschnitt [alt_names] der .cnf-Datei gelesen werden sollen.
  • keyUsage = critical, digitalSignature, keyEncipherment: Dies ist ein kritischer Eintrag. digitalSignature erlaubt das Zertifikat, digitale Signaturen zu erstellen (wichtig für den TLS-Handshake). keyEncipherment erlaubt das Zertifikat, Schlüssel zu verschlüsseln (auch wichtig für TLS).
  • extendedKeyUsage = serverAuth: Dies gibt an, dass das Zertifikat für die Authentifizierung eines Servers bei TLS-Handshakes verwendet werden kann.

 

Das Wort „critical“ in diesen Einträgen bedeutet, dass die Verwendung des Zertifikats streng auf die angegebenen Zwecke beschränkt ist. Wenn ein Zertifikat zum Beispiel den Eintrag keyUsage = critical, digitalSignature hat, dann darf es nur zum Erstellen digitaler Signaturen verwendet werden und für keinen anderen Zweck.

 

Zertifikat in Android importieren

Das ca.crt nun wie von Passbolt beschrieben in Android importieren:

https://help.passbolt.com/faq/hosting/how-to-import-ssl-certificate-on-mobile

 

Es bietet sich an ein NAS-System (oder eine Netzwerkfreigabe) auf dem Handy einzubinden, um das Zertifikat einfach verschieben zu können.

Bei meinem Android-Handy (Android 13) wird das Zertifikat wie folgt installiert:

Einstellungen -> Sicherheit und Datenschutz -> Andere Sicherheitseinstellungen -> Von Gerätespeicher installieren -> CA-Zertifikat -> Trotzdem installieren -> Eingabe des PIN -> Auswahl des Zertifikats -> OK

Nach dem Import kann die Zertifikatsdatei vom Gerät gelöscht werden.

 

Passbolt-Server konfigurieren

Hat man die Zertifikate erstellt und in Android eingebunden, muss noch der Passbolt-Server damit ausgestattet werden.

Dazu folgendes eingeben (startet einen Assistenten, das MUSS zwingend durchlaufen werden, da die Zertifikate innerhalb der Passbolt-Installation kopiert werden):

sudo dpkg-reconfigure passbolt-ce-server

Die Abfragen lauten bei einer bestehenden Installation:
Nein -> Ja -> Manual -> IP oder DNS-Name (wie im Server-Zertifikat unter CN angegeben) -> /home/username/passbolt.crt -> /home/username/passbolt.key

Die Pfadangaben zur „passbolt.crt“ und zum „passbolt.key“ müssen natürlich entsprechend Ihrem System angepasst werden!

sudo nginx -s reload

 

Optional

Wenn Sie eine automatische Umleitung von http zu https möchten, kann man das auch noch konfigurieren:

sudo nano /etc/nginx/sites-enabled/nginx-passbolt.conf

Darin ganz unten einfügen (ggf. vorhandenen Port-443-Block löschen!!):

server {
listen 80;
server_name 1.2.3.4;
return 301 https://1.2.3.4;
}

Abschließend:

sudo nginx -s reload

 

Passbolt-App konfigurieren

Hat man nun alles eingerichtet, kann man an die eigentliche Einrichtung der Passbolt-App gehen.

Zuerst öffnet man Passbolt wie gewohnt im Browser und meldet sich an. Nun klickt man (rechts oben) auf seinen Namen und wählt „Mobile Apps“. Alternativ ist dies auch über „Profile“ -> „Mobile Setup“ erreichbar:

 

Im nächsten Fenster klickt man auf „Start“:

 

Es öffnet sich ein weiteres Fenster mit dem ersten QR-Code:

 

Nun öffnet man am Handy sie Passbolt-App und wählt „Mit einem bestehenden Konto verbinden“:

 

Es folgt ein Hinweis den QR-Code (im Browser) zu öffnen, hier auf „QR-Code scannen“ drücken (ggf. die Berechtigung zur Nutzung der Kamera erteilen):

 

Die App scannt nun die QR-Codes auf dem Bildschirm, die Webseite generiert automatisch weitere Codes und die App liest diese automatisch ein. Ist alles durchlaufen sollte „Ihre Daten wurden übertragen“ erscheinen:

 

Nach einem Klick auf „Weiter“ wird man mit der Login-Maske in der App begrüßt (ab jetzt kann man keine Screenshots mehr aufnehmen). Hier wird das gleiche Passwort wie zur Anmeldung im Browser genutzt.

Im Browser wird (zumindest bei mir in Firefox mit der Extension-Version 4.3.1) ein Fehler angezeigt. Allerdings ist die Einrichtung erfolgreich durchlaufen und die App kann ab jetzt ohne Einschränkungen genutzt werden:

 

Da es sich dabei um einen selbst gehosteten Passwortmanager handelt, wird zur Nutzung zwingend eine Netzwerkverbindung zum Server benötigt! Diese ist z. B. von unterwegs aus ggf. mittels VPN umzusetzen.

 

Referenzen:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert