Sichere Kommunikation in iOS 9

Google tut es, Apple jetzt auch: HTTPS everywhere. Das macht durchaus Sinn, da die Kommunikation im Internet so durchgängig verschlüsselt und potentiell etwas sicherer gegen die NSA Angreifer wird. Ich wage mal die Prognose, dass das HTTP-Protokoll in 2-3 Jahren weitestgehend Vergangenheit sein dürfte, zumal die notwendigen Zertifikate  in Kürze kostenfrei erhältlich sein werden. So, zurück zu Apple und iOS 9.

Apple springt also auf den Verschlüsselungs-Zug mit auf und fordert ab iOS 9 für sämtliche Backend-Kommunikation in einer App die Nutzung von HTTPS. An dieser App Transport Security (ATS) führt kein Weg vorbei und unverschlüsselte Aufrufe von NSURLConnectionCFURL oder NSURLSession führen unweigerlich zu einer Fehlermeldung. Dies betrifft Apps, die mit einem Backend-Server oder API kommunizieren (und das dürften die meisten sein), aber auch solche, die innerhalb einer UIWebView Informationen per JavaScript/Ajax aus dem Web nachladen. Somit sind potentiell auch alle hybriden App-Ansätze wie Phone Gap und Appcelerator betroffen.

Laut diversen Dokumentationen soll ATS nur bei Apps greifen, die gegen das iOS 9 SDK kompiliert werden. Ich bin mir nicht sicher, ob das so stimmt: meiner Erfahrung nach gilt das unter bestimmten (mir nicht klaren!) Umständen für alle Apps, also auch solche, die bereits im Store stehen und nach einem Update der Endgeräte auf iOS 9 plötzlich nicht mehr funktionsfähig sind. Das Phänomen tritt jedoch nicht durchgängig auf und ist somit nur sehr schwer nachvollziehbar – sehr ärgerlich.

Allerdings hat Apple Ausnahmen vorgesehen, die speziell konfiguriert werden müssen. Eine Möglichkeit besteht darin, in der Info.plist bestimmte Domains gezielt auszunehmen.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.domain.de</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Schwierig wird das, wenn eine App nicht vorher weiß, auf welchen Backend-Server sie zugreifen muss, etwa weil diese URL in der App frei konfigurierbar ist. In diesem Fall kann ATS in der Info.plist komplett deaktiviert werden:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Apple weist ausdrücklich darauf hin, dass dies das „Mittel der letzten Wahl“ sein sollte. Ob derartige Apps bereits heute, oder irgendwann in der Zukunft, von Apple nicht mehr in den App Store gelassen werden, ist derzeit unklar. Ich habe eine solche App gerade zur Freigabe in den Store gestellt und werde berichten. Nachtrag: zumindest diese App wurde problemlos durchgewunken. Das kann bei anderen Apps aber unterschiedlich sein.

Auch Xamarin (meine Lieblings-Programmierumgebung für plattformübergreifende Apps) hat einen entsprechenden Hinweis für ATS in iOS 9 erstellt.

Schreibe einen Kommentar

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