[HowTo] mobileconfig signieren
Wie signiere ich ich ein mobileconfig? Hier eine kurzer Waschzettel.
Ich hab einige Macs bzw. iOS Devices die ich selbst nutze bzw. um die ich mich aus dem Familien- & Freundeskreis kümmere.
Jetzt jemandem erklären per Telefon,Skype oder Email wie er was einstellt wird kompliziert wenn es mehren Sachen sind die einzurichten sind.
Nun hat Apple da den schönen iPhone Configurator mit dem man ein entsprechendes Konfigurations-Profil erstellen kann.
Viele Dinge kann man in ein Profil packen:
Hier ein kleiner Auszug über die Möglichkeiten über die will ich mich jetzt nicht hier auslassen.
Wenn man das Konfigurations-Profil jetzt auf sein iPhone installieren möchte bekommt man folgendes zu sehen:
Man kann dieses Profil nun zwar installieren aber man wird (zurecht auch) von iOS drauf hingewiesen das es ein unsigniertes Profil ist.
Um jetzt den “betreuten” Nutzern nicht noch Angst einzujagen will man das einfach nicht haben und das Profil muss signiert werden.
Jetzt hab ich einige Zeit mir einen Handkoffer zusammen gesucht und keine so richtige Anleitung gefunden die auf Anhieb funktionierte oder nicht gerade für Leute geschrieben ist die nicht Entwickler sind. Ausserdem fand ich keine bisher in Deutsch! Einen Teil hatte ich schon ausgefunden bevor ich für das letzte Puzzlestück diese englische Anleitung gefunden hatte.
Da ich meine Domains mit einem StartSSL-Zertifikat ausgestattet hatte und diese auf den aktuellen System installiert sind lag die Idee nahe es damit zu machen.
Für Leute mit z.b. einem Developer-Zertifikat oder ähnlichem funktioniert das genauso. Entsprechend wären die Dateien bei Punkte 2,3 und 4 einfach auszutauschen. Habe da aber nicht genau nachgeforscht ggf. kann ein Developer sich dazu mal in den Kommentaren auslassen. Ich ergänze es dann hier 🙂
In meinem Fall nutzte ich dazu das SSL-Zertifikat was ich für meinen Domain habe. Man kann es aber auch mit einem Email-Zertifikat signieren. Bei Interesse ergänze ich die Anleitung darum.
So jetzt fangen wir an was wir brauchen um es zu signieren:
- konfiguration-unsigniert.mobileconfig = ist eure erstelltes & unsigniertes Profil
- server-ssl.crt = das SSL-Zertifikat inkl. Zwischenzertifikat (siehe hier ganz unten wie man dieses erstellt)
- server-Private.key ist der Private Key den man angelegt hat für das StartSSL-Zertifikat.
- ca-bundle.crt ist das certificate bündle von StartCom die das StartSSL-Zertifikat ausstellen. Ich habe das komplette Bündle genommen dort sind alle Zertifikate enthalten (Class 1,Class 2,etc…; jenachdem was ihr euch dort geklickt habt) Dieses findet ihr hier zum downloaden.
- konfiguration-signiert.mobileconfig wird dann unser signiertes Profil sein.
So jetzt darf man das Terminal öffnen denn dieses wird benötigt um unsere Konfigurations-Profil zu signieren.
Genutzt wird openssl zum signieren.
Folgendes Kommando
openssl smime -sign -in konfiguration-unsigniert.mobileconfig -out konfiguration-signiert.mobileconfig -signer server-ssl.crt -inkey server-Private.key -certfile ca-bundle.crt -outform der -nodetach
Die Argumente “-outform der -nodetach” muss man setzten damit iOS es im richtigen Format vorgesetzt bekommt.
So und jetzt sind unser mobileconfig beim Installieren so aus:
Noch Fragen? Verbesserungen? Oder einfach nur Feedback nutzt die Kommentarfunktion. Flattern dürfte ihr natürlich auch gerne.
Hi, ich würde gerne meine vorhandene *.mobileconfig Datei mit meiner Root Certificat Authority i.V.m. openssl signieren, stehe aber diesbezüglich vollkommen auf dem Schlauch.
Zur Vorgeschichte:
Auf meinem IOS-Devices habe ich das öffentliche Zertifikat meiner Root-CA installiert, so dass alle mit der Root-CA signierten Email-Zertifikate – überwiegend s/mine Zertifikate – als gültig erklärt werden. Die Zertifikate erstelle und verwalte ich mit dem Programm xca.
Ich würde mich sehr freuen, wenn Sie zum o.g. Problem auch ein kleines Tutorial schreiben könnten.
N.-A. R.
Soweit ich weiß und auch durch Suche im Netz raus gefunden habe muss man folgende Schritte machen:
1) mit der Root-CA ein Zertifikat erstellen (z.b.: für seine Domain; als würde man das Zertifikat für seinen Webserver nutzen: Siehe hierzu folgender Link https://zum-en.de/3y ab Überschrift “Serverzertifikate generieren”)
2) Und dann kann man die Befehle übernehmen die ich im Blogpost niedergeschrieben habe. Bei Punkt 4 nimmt man halt seine CA.
So würde ich es machen 🙂 Funktioniert auch so. Hatte für Testzwecke auch mal eine eigene CA aufgesetzt.
Hi, mit dem Programm “xca” lassen sich leider keine Dateien mit der Endung *.key erzeugen!
Vorgehensweise:
1. server.crt mit dem Programm “xca” erzeugt.
2. ca.crt mit dem o.g. Programm erzeugt.
Frage:
Wie erzeuge bzw. exportiere ich die *.key Datei aus einer *.der bzw. *.pem Datei und lässt sich dieser Schritt fielleicht umgehen?
Hinweis:
Der RSA Schlüssel läßt sich mit xca als *.der bzw. *.pem exportieren, dabei kann angegeben werden ob man den privaten Teil des Schlüssels mit exportieren möchte!
Zusätzlich kann man noch als PKCS 8 Exportieren auswählen.
Um die .key zu erzeugen nutzt man folgenden Befehl auf der Kommandozeile
openssl req -newkey rsa:4096 -sha256 -keyout private.key -out request.csr
Du musst die Dateien ja eh nur 1mal erzeugen (wie bei mir) und dann kannst du alles signieren.
BTW:
Zum signieren deines SSL-Zertifikat ist auch lesenswert https://zum-en.de/3z
Schlussendlich solltest du das selbe Ergebnis haben wie ich auf dem letzten Bild (wird halt auf iOS&Co. nur als valide erkannt wo deine Root-CA importiert wurde).
Hallo Arnaud,
danke für deine letzte Info.
Könntest Du alle benötigten Befehlszeilen von openssl von Anfang an chronologisch aufschreiben. Weil jedes z.g. Tutorials mit unterschiedlichen Dateiformaten (pem, key, cer … ) hantiert und ich hierbei letztendlich doch wieder auf dem Schlauch stehe.
Beispielsweise in dieser Form:
# Erstellen der CA:
openssl req -new -x509 -newkey rsa:4096 -keyout cakey.pem -out cacert.pem -days 29200
#Schlüssel für das Serverzertifikat erzeugen:
openssl genrsa -out serverkey.pem -aes256 4096 -days 25550
#Passphrase aus dem serverkey.pem entfernen:
openssl rsa -in serverkey.pem -out serverkey.pem
#Certificate Signing Request erzeugen:
openssl req -new -key serverkey.pem -out req.pem -nodes
???
Ps.
Ich Arbeite mit einem Mac und erzeuge die Zertifikate etc. mit Hilfe des Terminals.
Im Tutorial von MATHIAS KETTNER heißt es, dass man die OpenSSL-Konfiguration anpassen muss. Die entsprechende openssl.cnf finde ich aber leider nirgendswo. Das Programm OpenSSL ist beim mac gleich integriert, so dass ich es nicht wie unter Windows extra installieren musste.
Danke
Also den Punkt mit der .cnf kannst du auslassen.
Ich nutze auch einen Mac.
Als weiteres Anleitung die treffender ist nutze https://zum-en.de/3A . Die Anleitung endet für dich dann dort nach dem signieren der Request für das SSL-Zertifikat.
Ich überlege vielleicht mal, wenn die Zeit da ist, noch einen Waschzettel zu schreiben wo man die Sache macht mit seiner RootCA (also Zertifikate erstellen, etc…) So das man alle Dateien zusammen hat wo man dann einfach mit diesem Waschzettel weiter machen kann.
Leider hat deine Anleitung nicht ganz funktioniert. Wohl aber dieser Befehl:
openssl smime -sign -signer cert.pem -inkey key.pem -certfile ca-bundle.pem -nodetach -outform der -in profile-uns.mobileconfig -out profile-sig.mobileconfig
Hast du zufällig eine Idee, wie ich das unter PHP zum Laufen bringe? openssl_pkcs7_sign(…) bringt mich nicht zu dem gewünschten Ergebnis (die Struktur des Profils ist dahin…).
Dennoch herzlichen Dank für deine Anleitung, ich war lange auf der Suche danach. Große Klasse!
Also warum bei dir das nicht läuft weiß ich nicht. Bei mir ,und noch ein paar Leuten im Freundes- & Bekanntenkreis, läuft das so durch wie oben beschrieben (alle unter OS X).
Habe mir auch einen Alias im Terminal angelegt das ich mit “signmc” alle Mobileconfigs im selben Ordner gesignt werden. Mal schauen wenn das in schön ist vll stelle ich es hier und auf Github.
Kommt eine Fehlermeldung bei dir?
Zu PHP hab ich keine Lösung, habe mich aber bisher noch nicht damit befasst. Nur mal durch zufall was gesehen. Aber bei der Lösung braucht man zugriff auf den Webserver (Apache oder nginx). Also weniger geeignet für Shared-Webspace-Geschichten.
Danke für die Rückmeldung! Die Fehlermeldung lautete, dass kein Singer-Zertifikat gefunden wurde (was aber albern ist, da es ja in anderer Schreibweise funktioniert hat). Ich kann nur spekulieren, dass es an der Kodierung lag (cer bzw. crt vs. pem).
Zum Thema PHP: Es klappt wunderbar mit exec(‘DER_BEFEHL_VON_OBEN’), falls das hier nochmal jemand lesen und interessieren sollte. Ich habe das heute Morgen herausgefunden. 🙂
Kann Möglich sein mit der Kodierung. Aber solange es bei uns funktioniert jeweils 😉
Zu PHP: Du kannst es damit machen, jedoch ist mein letzter Kenntnisstand das es nicht unbedingt sicher ist. Lasse mich da gerne berichtigen. Du solltest mittels .htaccess (wenn es ein Apache-Webserver ist) die Dateien von Zugriff von aussen aber schützen.
Die vorhin angesprochene Lösung wo man halt zugriff auf den Webserver braucht scheint wohl soweit ich gelesen hatte, deutlich sicherer zu sein.
Persönlich musste ich das auch noch nicht nutzen. Aber denk wegen der certs&co. an die Sicherheit wenn du es so per PHP löst.
Klar, der Zugriff ist so und so nur nach Authentifizierung möglich, da die mobileconfigs mit genau dieses Daten (Username, PW, …) gefüttert werden. Leider läuft die exec()-Funktion nur mit direktem Zugriff auf die Kommandozeile, was, ohne Schutz, ziemlich schnell übel enden könnte. Aber da alles geschützt ist, sollte das passen. Trotzdem danke für deine “Sorge”.
Und der Zugriff auf die exec()-Funktion hast du nicht wirklich bei Shared Webspace (so ist mein letzter Kenntnisstand).
Hast du deine “Zusammenstellung” auf Github oder könntest du es mir mal per email zukommen lassen? Vielleicht ist das was für 1-2 zukünftige interne Familien-Projekte (Lösung vor dem Problem gefunden 😉 ). Hört sich interessant an 🙂
Email findest du im Impressum.
Normalerweise nicht, es sei denn, der Hoster akzeptiert es. Dies tut er in meinem Fall, indem er mir dafür den CGI-Modus anbietet (ebenso für shell_exec()). Ich nehme aber mal an, dass die meisten Kommandos geblockt sind.
Welche Zusammenstellung hättest du denn gerne? Die für PHP?
Jeap die für PHP, so wie du es gelöst hast. Anschauen kann man sich ja mal 😉
Denke mal du hattest es so für dich gemacht, Upload und fertig 😉 Klar man muss die Pfade etc. anpassen aber erklärt sich wohl von selbst.
Mail ist raus. Viel Spaß damit!
Vielen Dank
Müssen die Profile auch erneuert werden, sobald das Zertifikat abläuft?
Ich “befürchte” schon.
Hab gerade erfolgreich mit einem Lets Encrypt-Zertifikat signiert. Und die halten ja bekanntlicherweise nur 90 Tage…
Dennis
Befürchte ich auch (auch wenn ich aktuell kein Let’s Encrypt einsetze).
Entweder eigene CA aufsetzen (muss man aber dann in jeder Gerät importieren) oder für sowas StartSSL nur nutzen, würde ich spontan sagen.
Vorgestern ist dein Blogbeitrag 1 Jahr alt geworden. Ist dir nicht auch das StartSSL-Zertifikat abgelaufen? 😉
Eine eigene CA ist natürlich auch eine Überlegung wert.
oh stimmt (das der Post schon 1 Jahr alt ist).
Bin zwischen zeitlich auf StartSSL Class2 gewechselt (Gründe u.a.: läuft 2Jahre & WildCards möglich).
Hatte ich mir geklickt bevor Let’s Encrypt an den Start ging.
Kannst ja deine CA per mobileconfig ,die du z.b.: mit StartSSL signierst, verteilen und ab da hast du das auf den jeweiligen Geräten.
Wobei man will ja genau den Schritt eigentlich nicht haben, aber muss glaube ich jeder für sich selbst entscheiden
Hi, ist zwar schon länger her, aber ich hoffe du kannst weiter helfen ^.^ Ich habe im Schlüsselbund ein gültiges E-Mail Zertifikat zum signieren in Mail, funktioniert auch einwandfrei. Allerdings habe ich keine Idee wie ich dies zum signieren der mobileconfig verwenden kann. Du meintest, das müsste auch irgendwie gehen ? Ich habe nur eine “xxx.crt.p7s” und xxx.p12 Datei.