Die selbstsignierte Zertifikatsinstallation behauptet, erfolgreich zu sein, aber Android tut so, als ob das Zertifikat nicht vorhanden wäre

17

Ich versuche, das selbstsignierte Zertifikat für meinen Webserver in Android 4.3 zu installieren. Ich habe die .crt-Datei im Stammverzeichnis der SD-Karte (die tatsächlich emuliert wird, da sich keine SD-Karte im Steckplatz befindet).

Um das Zertifikat zu installieren, gehe ich zu Einstellungen -> Allgemein -> Sicherheit -> Anmeldeinformationsspeicher -> Vom Gerätespeicher installieren.

Ich erhalte ein Dialogfeld mit dem Namen des Zertifikats (der Dateiname abzüglich der Erweiterung .crt), das ich ändern kann (aber nicht). Ein Pulldown für "Verwendet für" wird angezeigt, wobei "VPN und Apps" ausgewählt ist und unten Text angezeigt wird des Dialogs, der informiert "Paket enthält: ein Benutzerzertifikat". Alles sieht in Ordnung aus, also klicke ich auf "Ok". Der Dialog verschwindet und eine Toastmeldung erscheint mit "[Name] installiert".

Wenn ich jedoch sofort zu "Vertrauenswürdige Anmeldeinformationen" gehe und "Benutzer" auswähle, ist dort nichts! Das neue Zertifikat befindet sich auch nicht unter "System", aber ich würde es dort nicht erwarten Ich erhalte weiterhin die Warnung, dass das Zertifikat der Site nicht vertrauenswürdig ist. Ich habe auch versucht, neu zu starten, aber es macht keinen Unterschied.

Was mache ich falsch? Das völlige Fehlen von Fehlermeldungen ist nicht hilfreich. Ist es möglich, dass mein Zertifikat im falschen Format vorliegt? Ich habe versucht, die .crt-Datei im ssl-Verzeichnis des Servers zu verwenden, und ich habe versucht, sie in das DER-Format zu konvertieren.

Update: Ich habe irgendwo gelesen, dass Android Zertifikate im p12-Format benötigt. Daher habe ich das Apache2-Zertifikat mit dem folgenden Befehl in p12 konvertiert:

openssl pkcs12 -export -inkey server.key -in server.crt -out ~/server.p12

Ich wiederholte dann die obigen Schritte, erhielt die gleiche Erfolgsmeldung und fuhr dann fort, das Zertifikat immer noch nicht in den Benutzeranmeldeinformationen zu sehen, und ich erhalte immer noch den nicht vertrauenswürdigen Zertifikatfehler vom mobilen Browser.

Michael
quelle

Antworten:

19

Ich hatte das gleiche Problem damit, dass Android das Zertifikat wirklich installierte, bis ich diese Seite fand, die eine für mich funktionierende Methode beschreibt. Es läuft auf folgende Schritte hinaus:

  1. Erstellen Sie einen privaten Schlüssel und ein öffentliches x509-Zertifikat mit v3_req-Erweiterungen und aktiviert als Zertifizierungsstelle:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/my_site.key -out /etc/ssl/certs/my_site.crt -reqexts v3_req -extensions v3_ca

  2. Konvertieren Sie das Zertifikat in das DER-Format, das von Android verstanden wird:

    sudo openssl x509 -in /etc/ssl/certs/my_site.crt -outform der -out my_site.der.crt

  3. Verwenden Sie eine beliebige Methode, um my_site.der.crtauf Ihr Android-Gerät zuzugreifen. Ich fand es einfach, die Datei von meinem Webserver hosten zu lassen und über den Android-Browser herunterzuladen, sodass Sie sie dann automatisch installieren können.

Obwohl ich mir gewünscht hätte, dass Schritt 1 in zwei Teile geteilt wird (1a. Generation des privaten Schlüssels und 1b. Generation des öffentlichen Zertifikats), habe ich nicht zu viel Zeit investiert, um zu untersuchen, wie das geht. Bitte lassen Sie mich in einem Kommentar wissen, ob Sie einen Weg gefunden haben, der funktioniert, danke.

(Anstatt einen Kommentar hinzuzufügen, glaube ich, dass dies als Teil der Antwort für zukünftige Referenz wirklich gehört, also bearbeite ich es in. --Michael)

Anstatt ein Zertifikat zu erstellen, das als Zertifizierungsstelle aktiviert ist, habe ich eine selbstsignierte Zertifizierungsstelle erstellt und anschließend meinen vorhandenen Schlüssel / csr mit der neuen Zertifizierungsstelle neu signiert. Dann habe ich die selbstsignierte CA zu Android und voila hinzugefügt! Es funktionierte!

Generieren der selbstsignierten Zertifizierungsstelle:

openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem

Erneutes Signieren eines vorhandenen CSR, den ich von der Erstellung des Schlüssels aus hatte

openssl x509 -req -in existing.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out existing.crt -days 3649

Mit einer modifizierten Form Ihres zweiten Befehls habe ich das CA-Zertifikat in das DER-Formular konvertiert:

openssl x509 -in /etc/apache2/ssl/rootCA.pem -outform der -out ~/rootCA.der.crt

Das Tolle daran ist, dass alle zusätzlichen nicht vertrauenswürdigen Zertifikate, die jetzt mit der neuen selbstsignierten Zertifizierungsstelle neu signiert werden, nun auf jedem Gerät als der neuen Zertifizierungsstelle als vertrauenswürdig eingestuft werden, ohne dass etwas anderes installiert werden muss. Dies löst nicht gerade das Problem, dass Sie Websites vertrauen, auf die Sie keinen Einfluss haben. Es kann jedoch einfacher sein, wenn Sie Einfluss auf Ihre IT-Abteilung für einen internen Server oder ähnliches haben.

FriendFX
quelle
1
Ich habe bereits das Zertifikat, das ich installieren muss. Daher habe ich Schritt 2 ausprobiert und es wird immer noch nicht in den vertrauenswürdigen Benutzerdaten angezeigt, nachdem behauptet wurde, dass die Installation erfolgreich war. Chrome zeigt nach dem Neustart immer noch den Fehler "Nicht vertrauenswürdige Site" an.
Michael
1
Könnte es etwas an der Erweiterung v3_req geben, das als Zertifizierungsstelle aktiviert ist, damit das Zertifikat von Android verwendet werden kann? Wenn ja, gibt es einen Befehl, mit dem ich ein vorhandenes Zertifikat nehmen und diese Informationen hinzufügen kann, da ich nicht die Kontrolle über alle Zertifikate habe, die ich installieren möchte.
Michael
3
Um die erste Hälfte meiner vorherigen Frage zu beantworten, habe ich die von Ihnen verlinkte Seite gelesen und es scheint, dass das Problem darin besteht, dass Android sich weigert, selbstsignierte Zertifikate (aber keine selbstsignierten Zertifizierungsstellen) zu installieren. Dies scheint nicht (der) dokumentiert zu sein, und die Tatsache, dass Android vorgibt, es zu installieren, macht es noch schlimmer. Es bleibt jedoch die Frage, ob ich ein selbstsigniertes Zertifikat habe, über das ich keine Kontrolle habe. Kann ich es auf irgendeine Weise "CA" -signieren, damit ich es installieren kann?
Michael
1
@ Ich hoffe, es macht Ihnen nichts aus, ich werde Ihre Antwort bearbeiten, um meine Lösung einzuschließen, anstatt sie in die Kommentare aufzunehmen, da sie wirklich Teil der Antwort ist.
Michael
1
Ich verstehe nicht, wie die vorhandene CSR-Signaturanforderung generiert wird. Ich denke, dies ist der letzte fehlende Punkt für ein komplettes Schritt-für-Schritt-Tutorial.
cguenther