ATS & https krav på iOS

Nye Apple ATS og https krav på iPhone og iPad (iOS) fra 2017. 

Hvis du har arbejdet med iOS apps indenfor det seneste år, mere præcist siden udgivelsen af iOS 9, har du måske bidt mærke i at Apple introducerede App Transport Security (også kendt som ATS).

ATS går kort fortalt ud på at al web-kommunikation i apps som understøtter iOS 9 og nyere, som udgangspunkt skal foregå via https fremfor http. ATS håndhæves af NSURLSession klassen og alle API’er som benytter denne, og er automatisk aktiveret fra iOS 9 og nyere. Den ældre NSURLConnection klasse håndhæver også ATS hvis du bygger til iOS 9 og nyere.

 

Forudsætninger for understøttelse af https

  1. Din app skal implementeres så den kommunikerer via https fremfor http.
  2. Din content provider der anvendes i din app skal supportere og udstille data via https.

Udfordringen ved ATS opstår hvis din content provider ikke understøtter https. Det bør de selvfølgelig gøre, og hvis de ikke gør, bør du starte med at bede dem om at understøtte https. Så er problemet løst, og du skal blot implementere pkt. 1 herover!

Vi ved dog alle at verden sjældent er så simpel, og der ingen garanti er for at vi kan få https understøttelse fra i morgen, hvorfor Apple har været så flinke at tilbyde flere undtagelser for ATS, som man kan sætte i Info.plist filen:

NSAppTransportSecurity : Dictionary {
    NSExceptionDomains : Dictionary {
        <domain-name-string> : Dictionary {
            NSIncludesSubdomains : Boolean
            NSExceptionAllowsInsecureHTTPLoads : Boolean
            NSRequiresCertificateTransparency : Boolean
            NSExceptionRequiresForwardSecrecy : Boolean
            NSExceptionMinimumTLSVersion : String
        }
    }
    NSAllowsArbitraryLoads : Boolean
    NSAllowsArbitraryLoadsInMedia : Boolean
    NSAllowsArbitraryLoadsInWebContent : Boolean
    NSAllowsLocalNetworking : Boolean
}

Her kan du blandt andet angive NSExceptionDomains, hvormed du kan tillade http for et eller flere domæner. Hvis domænet allerede understøtter https, men med en ældre standard kan du også opsætte undtagelser for dette med en af flere nøgler. Du har også mulighed for at slå ATS helt fra ved at sætte NSAllowsArbitraryLoads nøglen til YES.

Hidtil har man frit kunnet tilføje undtagelser, og som sagt også kunnet slå ATS helt fra, hvis man ikke kunne overtale sin content provider til at sætte en smækker SSL binding op, men fra årsskiftet skal der nye boller på suppen.

 

Ingen undskyldning længere. Undtagen, når den er virkelig god…

Apple har på WWDC 2016 under en forelæsning annonceret at ATS vil være et krav fra slutningen af 2016 (se den HER).

Den udmelding har givet en del usikkerhed. Som hvad det betyder for ens eksisterende apps, samt hvad man gør når man ikke kan få den https forbindelse til en tredjeparts provider, man har ønsket sig i over et år? Rent teknisk fortsætter ATS som det har fungeret siden iOS 9, med nogle få nye undtagelses-muligheder.

Det nye ligger i app store reviewet. For flere af de mulige undtagelser, som f.eks. at deaktivere ATS helt eller blot for et domæne, kræves det fra årsskiftet at man har argumenterne klar. Med chance for at ens argument ikke er godt nok, og ens nye app update bliver afvist af Apple.

 

Hvad skal du gøre nu

  1. Du bør til en start undersøge om din content provider og tredjeparts komponenter allerede i dag understøtter https med TLS 1.2. Hvis ja, skal du blot tilpasse din app til at kommunikere via https og læne dig tilbage med ro i sjælen.
  2. Hvis du har content providers som ikke understøtter ATS, bør du undersøge om de kan opgradere deres forbindelser inden for en overskuelig fremtid.
  3. Hvis https ikke er eller bliver en mulighed, skal du for apps som allerede er released til iOS 9, overveje om din argumentation for at komme igennem det næste app review er god nok.
  4. Hvis din app endnu ikke er released til iOS 9 eller senere, og du er i gang med at forberede dette skal du sætte din Info.plist op med de relevante undtagelser. Og hvis du benytter en af nedenstående nøgler skal du overveje om din argumentation er god nok til at komme igennem et app review:
    • NSAllowsArbitraryLoads
    • NSExceptionAllowsInsecureHTTPLoads
    • NSExceptionMinimumTLSVersion

På dette LINK kan du læse om nogle af de scenarier hvor Apple vil overveje at lade din app slippe igennem nåleøjet uden https, og du kan også se hvilke scenarier som ikke kræver argumentation i review processen. 

 

Konklusion

Det efterlader os med følgende konklusion

  1. Alle iOS apps skal med nogle specifikke undtagelser benytte https fra årsskiftet.
  2. Du kan muligvis omgå kravet om https hvis du kan argumentere for at https ikke er muligt for din app.
  3. Du kan ignorere kravet om https hvis du har en app som er bygget specifikt til iOS 8 eller derunder.
  4. Det forventes at apps som er released inden udgangen af året fortsat vil kunne benytte http. Opdateringer i 2017 og frem vil dog kræve https istedet.

 

Af Brian Hansen
iOS Udvikler hos Touchlogic