Apple Push Notification Service (APNS): Zertifikate und Provisioning Profiles

Um über den eigenen Server Push-Nachrichten an eine iOS-App senden zu können, interagieren folgende vier Komponenten miteinander:

  1. Die iOS-App mit ihrer eindeutigen App-ID und dem Provisioning-Profile.
  2. Das iOS-Betriebssystem forder beim APNS (Apple Push Notification Service) für die Zustellung von Push-Notifications einen Device Token an.
  3. Der APNS-Server stellt den angeforderten Token aus und sendet auf Aufforderung von unserem Server die Nachricht an das Device.
  4. Der eigene Server versendet die Push-Nachricht an den APNS-Server unter Verwendung des Device Tokens.


Damit eine App Push-Notifications empfangen kann, muss sie mit einem für den Push-Service konfigurierten Provisioning Profile signiert werden. Die Aufforderung des eigenen Servers an den APNS-Server wird durch ein SSL-Zertifikat gesichert, was dafür sorgt, dass nur der eigene Server den Versand anstoßen kann.

Bei den Provivioning Profiles wird zwischen Development und Production unterschieden. Für beide Profile gibt es entsprechendes SSL-Zertifikat.

1. App ID erzeugen

Vorrausgesetzt wird an dieser Stelle ein bereits bestehender Entwickler-Account und die erfolgreiche Anmeldung im Apple Developer Portal.

Im Bereich iOS bitte nun auf Certificates, Identifiers & Profiles klicken, um dort unter Identifiers > App IDs eine neue App ID zu erzeugen. Für den eindeutigen Bundle-Identifier wird folgendes Schema empfohlen: „com.yoursite.AppName“

iOS Push-Cert: App ID erzeugen

Im anschließenden Screen können die Daten noch einmal geprüft werden. Ist dies getan erhält man die Nachricht:

Registration complete.
This App ID is now registered to your account and can be used in your provisioning profiles.

2. Certificate Signing Requests (CSR) erzeugen

Um im nächsten Schritt das SSL-Zertifikat erzeugen zu können, benötigt man einen CSR (Certificate Signing Requests). Dabei wird ein privater Schlüssel in der Schlüsselbundverwaltung (Keychain) des OS X Betriebssystems gespeichert. Mit dem CSR wird nun von einer Certificate Authority das dazu passende SSL-Zertifikat angefordert.

Als erstes bitte die Schlüsselbundverwaltung auf dem Mac starten und im Zertifikatsassistent den Punkt „Zertifikat einer Zertifizierungsinstanz anfordern“ auswählen.

Im folgenden Fenster bitte die Email-Adresse des Entwickler-Accounts, sowie einen allgemeinen Namen des Schlüssels eingeben. E-Mail der Zert.-Instanz kann leer bleiben. Unter Anfrage den Button „Auf Festplatte sichern“ wählen und die Datei CertificateSigningRequest.certSigningRequest an einem beliebigen Ort (temporär) speichern.

…und nun zurück zum Developer Portal in den Browser.

3. SSL-Zertifikat erzeugen

Durch Klick auf die gerade erzeugte App in der Übersicht, können nun die Apple Push Notification service SSL Certificates konfiguriert werden.

iOS Push-Cert:  SSL-Zertifikat erzeugen

Nach der Auswahl des Buttons unter Create certificate to use for this App ID erscheint eine Erläuterung zur Erzeugung des CSR und im nächsten Screen dann das Upload-Formular für die eben erstellte Request-Datei.

Ist die Berechnung des Zertifikats abgeschlossen, erscheint die erfreuliche Nachricht „Your certificate is ready.“ und man kann es herunterladen.

Schritt 2 „Certificate Signing Requests (CSR) erzeugen“ muss nun für das „Production SSL Certificate“ wiederholt werden, so dass im Anschluss die beiden Files aps_development.cer und aps_production.cer auf dem eigenen Rechner vorliegen. Zertifikate für Development besitzen eine Gültigkeitsdauer von 3 Monaten und können jederzeit wieder heruntergeladen werden. Production-Zertifikate haben ein Haltbarkeitsdatum von 12 Monate.

Durch einen Doppelklick auf die beiden .cer-Dateien werden nun die Zertifkate dem Schlüsselbund hinzugefügt.

4. Umwandlung in PEM-Format

Damit unser Server Push-Nofications versenden kann, benötigt er die Zertifkate im PEM-Format.
Im Schlüsselbund müssen nun die Zertifkate exportiert werden. Sie sind im Bereich „Anmeldung“ als Eintrag unter der Bezeichnung „Apple Development Push Services” zu finden. Den Eintrag bitte aufklappen und dann durch Rechtsklick beides beispiel auf dem Desktop ablegen. Das Zertifikat als „apns-dev-cert.p12” und den privaten Schlüssel als „apns-dev-key.p12“.

Im Terminal werden nun die beiden Datein konvertiert:

$ openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
$ openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12

Passphrase zu eliminieren:
$ openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem

Dateien kombinieren:
$ cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

5. Zertifikat überprüfen

Per Telnet beim APNS-Server anmelden:

$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.

Die Verbindung funktioniert, wird kurz darauf automatisch unterbrochen und wir prüfen nun mit:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev-cert.pem -key apns-dev-key.pem

6. Provisioning Profile erzeugen

Im Developer Portal unter dem Punkt „Provisioning Profiles“ wird jetzt ein neues Profile erzeugt. Auf die Frage „What type of provisioning profile do you need?“ antworte ich zunächst mit „Ad Hoc“ und wähle auf der nächsten Seite die neu angelegte App ID aus. Danach noch das Zertifikat und die gewünschten Devices auswählen. Zum Schluss dem Profile bitte noch einen sinnvollen Namen geben und herunterladen – fertig.

Der ein oder andere Schritt muss jetzt noch analog für das Produktivsystem erledigt werden.

Shell-Skript zur Umwandlung der Zertifikate in das PEM-Format

Die in Punkt 4 beschriebenen Schritte zur Konvertierung der Zertifikate in das PEM-Format erledigt auch das folgende Shell-Script:

# Bash
#!/bin/sh

echo input files need to be in current directory and be called xxx-cert.p12 and xxx-key.p12
echo xxx has to be provided as first parameter to the script

fileBaseName=$1
echo file base name: $fileBaseName

echo converting certificate
openssl pkcs12 -clcerts -nokeys -out "$fileBaseName"-cert.pem -in "$fileBaseName"-cert.p12

echo converting key
openssl pkcs12 -nocerts -out "$fileBaseName"-key.pem -in "$fileBaseName"-key.p12

echo removing passphrase from key
openssl rsa -in "$fileBaseName"-key.pem -out "$fileBaseName"-key-noenc.pem

echo combining certificate and key
cat "$fileBaseName"-cert.pem "$fileBaseName"-key-noenc.pem > "$fileBaseName".pem

# move intermediate files to sub folder
echo moving intermediate files to sub folder
mkdir intermediate
mv ./"$fileBaseName"-cert.pem ./intermediate/
mv ./"$fileBaseName"-cert.p12 ./intermediate/
mv ./"$fileBaseName"-key.pem ./intermediate/
mv ./"$fileBaseName"-key.p12 ./intermediate/
mv ./"$fileBaseName"-key-noenc.pem ./intermediate/

Vielen Dank an Benjamin Kuss, der dieses Script zur Verfügung gestellt hat.

2 Kommentare

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.


61 − = 52