Pagina 1 van 1

App Transport Security Exceptions opgelost (iOS 9+, OS X 10.11+)

App Transport Security Exceptions opgelost (iOS 9+, OS X 10.11+)
   3

Omdat ik continue op zoek ben naar de “beste” en “eenvoudigste” manier om applicaties voor meerdere platvormen te ontwikkelen (tot dusver is Lazarus Pascal is de winnaar), besloot ik Delphi 10 Seattle eens een poging te geven. Na dat ik bijgekomen was van de hart stilstand (na het lezen van de prijs), besloot ik de goedkopere variant, AppMethod te proberen. Vergeet niet dat AppMethod dan wel goedkoper mag zijn/lijken, het is nog steeds rete duur!

AppMethod is eigenlijk een interessant en bijzonder product (net als Delphi 10), en ondersteund Windows (32/64 bit), Mac OS X (ik gok even 32 bit), Android, en iOS (32 bit en 64 bit). Applicatie ontwikkeling en deployment is super makkelijk.

De eerste test die ik deed was een webpagina laden (van NZBGet), wat op alle platvormen prima werkte,… behalve voor iOS 9, waarbij de melding “The resource could not be loaded because the App Transport Security policy requires the use of a secure connection” verscheen.

Na flink wat zoekwerk vond ik het “waarom” en hoe je dit kunt oplossen – deze informatie is zeer zeker ook handig voor andere ontwikkelomgevingen.




Wat is die App Transport Security Exception ..?

Dit was de melding die ik kreeg toen ik even snel een webpagina wilde ophalen van mijn eigen NAS:

AppMethod - App Transport Security Exception

AppMethod – App Transport Security Exception

De sleutel hierbij: ENetHTTPClientException en ‘Error -1022 accessing to http://192.168.1.100:6789/hans:22101967/jsonprpc/status:
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

Na flink wat zoekwerk, vond ik dat de nieuwe iOS 9 regels, eisen dat web data over een secure verbinding moet plats vinden, dus “https” en dus niet “http” (in dit voorbeeld). Zie ook de Apple Developer Technote:

App Transport Security (ATS) is a feature that improves the security of connections between an app and web services. The feature consists of default connection requirements that conform to best practices for secure connections. Apps can override this default behavior and turn off transport security.

Ruw vertaald:

App Transport Security (ATS) is een functie welke de veiligheid van verbindingen tussen app en web services dient te verbeteren. Deze functie bepaalt dat de standaard verbinding eisen conform “best practices” gedaan dient te worden. Apps kunnen deze functie aanpassen en zelfs uit zetten.

In andere woorden: Dank je wel Apple voor het pushen voor veiliger data verkeer, en dank je wel cyber-criminelen om het leven ontwikkelaars weer moeilijker te maken. Tegenwoordig besteed ik het merendeel van mijn tijd aan het aanpassen aan nieuwe beveiligingsregels, en maar een klein deel van mijn tijd aan de applicatie functie zelf. Maar goed, in de toekomst zal dit wel weer makkelijker worden en vervangen worden door grotere problemen  … 

Hoe fixen we dit nu?

De beschreven methoden werken voor iOS en Mac OS X …

De meest voor de hand liggende oplossing is de verbinding secure maken (aanbevolen!).
In mijn geval, een SSL certificaat op m’n QNAP zetten en HTTPS gaan gebruiken. Helaas … een SSL certificaat kan niet gebruikt worden voor een privé IP adres, en is alleen maar beschikbaar voor publiekelijk toegankelijke sites (verbeter me als ik dit fout begrepen heb).

De andere optie is deze functie uitzetten.

Niet aanbevolen: Uitzetten van App Transport Security 

Deze functie heeft namelijk een erg goede toepassing: het beschermen van jouw data en de data van eventuele gebruiker. En dat is een goede zaak!
Zet het dus niet uit omdat het makkelijker is …

Soms echter, kun je er gewoon niet omheen. Wat je ook doet: bedenk goed hoe veilig betreffende data moet zijn.

Dit werkt NIET met IP adressen! 

De besproken Info.plist methode ondersteund het gebruik van een IP adres NIET!
Er is een bug report voor gemaakt, maar aangezien Apple (en anderen) sterk naar IPv6 bewegen, hoeven we eigenlijk ook niet te verwachten dat dit in de toekomst zal veranderen.

De enige optie die je hebt voor IP adressen is ATS geheel uitzetten (zie hieronder).

 

Hoe omzeilen we App Transport Security?

Zoals eerder gezegd: Het is beter een veilige connectie op te zetten dan App Transport Security te omzeilen!
De methode hieronder werken voor iOS 9 en nieuwer, en mogelijk ook voor Mac OS X 10.11 en nieuwer.
Voor wie iOS 9 beta gebruikt (die zou je toch niet meer nodig moeten hebben): de keywords voor de Info.plist zijn net even anders.

OK, dus er zijn situaties waarbij et omzeilen misschien onoverkomelijk is.

Als voorbeeld, mijn kleine App die met NZBGet babbelt op mijn QNAP NAS.
NZBGet is een geweldige tool als download manager voor Usenet, welke standaard SSL niet aan heeft staan. Installatie en activering van SSL is helaas ook niet super makkelijk en veel gebruikers doen het dan ook niet. Vaak is dat ook geen groot probleem omdat het in een prive netwerkje gebruikt wordt – thuis dus..

Dus om nu al die gebruikers niet uit te sluiten kan ik gewoon niet eisen dat een verbinding versleuteld wordt met SSL. Ik kan die grote groep gebruikers niet de lol van mijn Appje ontzeggen.

We kunnen Apt Transport Security in zijn geheel uitzetten of een paar uitzonderingen definieren en dat doen we via de zogenaamde Info.plist van jouw programma.

Meer informatie m.b.t. App Transport Security 

Ik laat je hier slechts een subset zien van wat je met ATS en de Info.plist kunt doen.
Het is zeker aan te raden de Apple Developer Technote eens door te lezen voor meer details en informatie.

Uitzetten van Apt Transport Security (niet aanbevolen)

Nu kan ik me eigenlijk maar 1 scenario bedenken waarbij je dit zou willen doen.
De situatie waarbij je nog niet kunt weten welke links jouw App gaat openen – bijvoorbeeld als je een web-browser gebouwd hebt. De eindgebruiker kan hier zo’n beetje alles onder de zon invullen en met geen mogelijkheid kun van te voren bepalen welke links dit zouden kunnen zijn.

Na wat spelen met ATS en iOS, is een tweede “reden” als je IP adressen in een lokaal netwerk wilt benaderen met HTTP.

Let op: geen van de opgehaalde web data (via HTTP) is veilig!!!

Hiervoor zou de Info.plist file er zou uit kunnen zien:


1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key> <!-- schakel ATS in z'n gehel uit -->
      <true/>
</dict>

Dit schakelt ATS in z’n geheel UIT … niet aan te raden, dus lees even verder voor betere alternatieven.

Definieer uitzonderingen voor Apt Transport Security (beter)

Als je echt ATS wilt uitschakelen (nogmaals: het is beter om HTTPS te activeren), dan is het gezonder om een beperkte lijst met uitzonderingen te definiëren.

Vergeet dus niet dat data die op deze manier (HTTP) wordt opgehaald dus NIET veilig is. Gebruik het dus alleen voor data die niet gevoelig is, bijvoorbeeld de weersvoorspelling.

In onderstaand voorbeeld, definieren we “voorbeeld.com” als domein waarbij HTTP gebruikt mag worden. We geven, optioneel, daarnaast aan dat dit ook voor diens subdomeinen geldt (www.example.com, mail.example.com, info.example.com, etc).


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>voorbeeld.com</key>
    <dict>
       <!-- onveilige HTTP toestaan voor deze server -->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
          <true/>
      <!-- en mogelijke sub domeinen -->
      <key>NSIncludesSubdomains</key>
          <true/>
    </dict>
  </dict>
</dict>

 

Andersom: Alles met uitzondering van …

De Info.plist kan echter ook andersom gebruikt worden. We schakelen App Transport Security voor echt alles uit, met de uitzondering van 1 of meer servers. Denk dan als voorbeeld aan de Google Chrome browser; alles is toegestaan, maar toegang tot jouw Google account MOET versleuteld zijn.

Onderstaande plist geeft hier een voorbeeld van.
Onveilige HTTP is toegstaan voor alle servers, behalve voor “voorbeeld.com” (en diens subdomeinen) – verbindingen naar deze server MOETEN secure (HTTPS) zijn.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
    <true>
  <key>NSExceptionDomains</key>
  <dict>
    <key>voorbeeld.com</key>
    <dict>
       <!-- voorbeeld.com MOET HTTPS gebruiken -->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
          <false/>
      <!-- en dat geldt ook voor diens subdomeinen -->
      <key>NSIncludesSubdomains</key>
          <true/>
    </dict>
  </dict>
</dict>

 

Praktische tips …

Nu weten we wat er gedaan dient te worden, tijd om te gaan kijken hoe we dit nu praktisch gaan doen met bijvoorbeeld Embarcadero producten.

Als eerste moet je wel weten dat een Mac of iOS applicatie een Info.plist bestand gebruiken voor het zetten van bepaalde kenmerken, je kunt dit in Embarcadero producten definiëren onder “Project”   Options”   Version Info“.

AppMethod - Versie Info laat de Info.plist info zien

AppMethod – Versie Info laat de Info.plist info zien

Het probleem is echter dat dit een beetje een beperkte editor voor plists is. We kunnen de gegevens die we net besproken hebben, hier simpel weg NIET invoeren.

Handmatig bewerken van Info.plist

Let op dat RAD Studio en AppMethod steeds opnieuw een Info.plist genreeert, zodra je jouw applicatie klaar gaat maken voor deployment – eventuele handmatige aanpassingen gaan dus dan verloren en je moet ze dus handmatig opnieuw invoeren. Ik ken mezelf, dat gaat gegarandeerd een keer fout.

If you decide to go the manual route (not recommended, but might be useful in other developer environments):

Open the Info.plist file with a text editor and add the code we have discussed just now, just before the last “</dict>” tag, and save the file.

Automated Editing of Info.plist

Pieter Scheldeman, van TMS Software, heeft een klein programma gemaakt dat ons leven net even makkelijk maakt.
Download het van de TMS Software Blog, of eventueel va Tweaking4All:

DOWNLOAD - IOS9Fix 

Platform: Windows
Bestand: iOS9Fix.zip
Omvang: 1.3 MiB
Datum: 13 okt 2015
 Download Nu 

Als eerste moet je de bestanden iOS9Fix.exe en iOS9Fix_config.txt naar jouw project directory kopiëren.
Voeg vervolgens aan het post-build command van jouw project toe zodat het aangeroepen wordt “$(PROJECTDIR)\iOS9Fix.exe” “$(OUTPUTPATH).info.plist“.

Om dit gedaan te krijgen ga je naar “Project”   Options“, selecteer links “Build Events” en zoek de regel “Command” onder “Post-build events“. Daar plak je dan deze regel:
 "$(PROJECTDIR)\iOS9Fix.exe" "$(OUTPUTPATH).info.plist" .

Nu zal iOS9Fix eventuele Info.plist vanzelf uit iOS9Fix_config.txt pakken en toevoegen aan de Info.plist van jouw applicatie.Je kunt hier natuurlijk ook andere Info.plist keys aan toevoegen.

De inhoud van iOS9Fix_config.txt zou er bijvoorbeeld zo uit kunnen zien:


1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Na uitvoeren van iOS9Fix.exe staat deze info netjes in de Info.plist van jouw project.

Kudo’s en veel dank aan Pieter en TSM Software!

 

Aanvullende Informatie Bronnen:

Het heeft me echt veel tijd gekost om zelf maar te kunnen vinden wat er fout gingn met m’n appje, de volgende artikelen waren daarbij zeer behulpzaam:

Donatie Opties


Donaties worden zeer gewaardeerd, maar zijn zeker niet vereist. Donaties worden gebruikt voor het dekken van kosten voor web-hosting en project materialen, en eventueel voor een drankje of een snack. Voor wie al gedoneerd heeft: Hartelijk dank! Het is werkelijk geweldig om te zien dat men onze artikelen en applicaties waardeert.

Reacties


Er zijn 3 reacties welke je hieronder kunt lezen.
Je kunt jouw eigen opmerkingen plaatsen m.b.v. dit formulier, of een reactie op een opmerking plaatsen door op de "Reageer" knop te klikken.



Jouw Reactie ...

Vriendelijk verzoek om hier geen lange teksten te plaatsen (zoals source codes, log files of config files). Gebruik daarvoor het Forum.

Deel met anderen:
*
*
Houd me op de hoogte van nieuwe reacties (email).
       Gebruik jouw RSS reader om reacties te volgen.


Tweaking4All uses the free Gravatar service for Avatar display.
Tweaking4All zal nooit jouw email adres met anderen delen.