ITSAppUsesNonExemptEncryption: heb je het nodig en wat vul je in?

Elke iOS-build loopt tegen één vraag over Amerikaanse exportcontrole aan, en niets in Xcode waarschuwt je dat hij eraan komt. Hij duikt op als de status «Missing Compliance», blokkeert TestFlight en legt je indiening stil. Deze pagina beantwoordt de enige twee vragen die ertoe doen: heb je het überhaupt nodig, en welke waarde zorgt dat de vraag niet bij elke build terugkomt.

Laatst gecontroleerd op 24 juli 2026.

Wat App Store Connect eigenlijk vraagt

Apps die via de App Store worden verspreid worden juridisch «geëxporteerd» vanuit de Verenigde Staten en vallen dus onder de Export Administration Regulations (EAR). Gebruikt je build versleuteling, dan moet App Store Connect weten of het de gewone soort is (vrijgesteld) of de soort waarvoor papierwerk nodig is (niet vrijgesteld). Meer betekent de vraag niet.

De adder: vrijwel elke app gebruikt tegenwoordig versleuteling, want elke HTTPS-aanroep doet dat. «Gebruikt je app versleuteling?» is dus bijna altijd ja — maar het antwoord dat je deblokkeert gaat over de vraag of die versleuteling vrijgesteld is, en voor de overgrote meerderheid van de apps is dat zo.

Beslisboom: gebruik je niet-vrijgestelde versleuteling?

Loop ze op volgorde af. De eerste die klopt bepaalt je antwoord.

  1. Gebruikt je app helemaal geen versleuteling, of niets meer dan wat iOS zelf biedt? → Vrijgesteld. Antwoord NEE (ITSAppUsesNonExemptEncryption = false).
  2. Blijft al je versleuteling beperkt tot HTTPS/TLS of de standaard crypto-API's die Apple in iOS/macOS meelevert (CryptoKit, Keychain, Secure Enclave, enz.)? → Vrijgesteld. Antwoord NEE. Dit dekt de overgrote meerderheid van de apps.
  3. Gebruik je versleuteling alleen voor authenticatie — wachtwoorden hashen, tokens ondertekenen — en niet om content van gebruikers te versleutelen? → Vrijgesteld. Antwoord NEE.
  4. Lever je je EIGEN versleutelingsalgoritme mee, of gebruik je crypto om gebruikersdata te beschermen voorbij het bovenstaande (bijvoorbeeld een eigen end-to-end-schema, een eigen cipher, bestanden versleuteld met je eigen sleutelbeheer)? → Mogelijk niet vrijgesteld. Antwoord JA en doorloop de zelfclassificatie (zie hieronder).

Standaardcryptografie hergebruiken via je eigen gemakswrapper maakt het niet niet-vrijgesteld — het gaat om het onderliggende algoritme, niet om het jasje eromheen. Pas het uitvinden of insluiten van een niet-standaard algoritme kantelt je naar niet vrijgesteld.

De twee manieren om te antwoorden — en waarom de plist wint

Er zijn precies twee plekken om dit te beantwoorden. Ze zijn niet gelijkwaardig: de een vraagt het bij elke release, de ander antwoordt één keer en blijft beantwoord.

WaarHoe vaak het gevraagd wordtHet beste voor
De vraag in App Store ConnectBij elke build. Elke upload naar TestFlight of de App Store toont «Missing Compliance» tot je de vragen opnieuw doorloopt.Een eenmalig geval, of wanneer je nu geen nieuwe binary kunt uitbrengen.
ITSAppUsesNonExemptEncryption in Info.plistNooit meer. De waarde reist mee in de binary; App Store Connect leest hem en slaat de vraag over voor die build en alle volgende met de sleutel erin.Elke app die geen eigen versleuteling meelevert — één keer instellen en vergeten.
Beide voldoen aan dezelfde Amerikaanse exportcontrole-eis; de plist-sleutel beantwoordt hem alleen definitief.

Het exacte plist-fragment

Voeg dit toe aan de Info.plist van je app-target (of via het tabblad Info / een xcconfig). Het is een boolean:

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

Doe daarna Clean Build Folder (⇧⌘K), archiveer opnieuw en upload. Op false zetten is alleen juist als je app volgens de boom hierboven vrijgesteld is — het is een juridische verklaring, geen mute-knop. Eén subtiliteit: een build die al in App Store Connect staat pikt de sleutel niet met terugwerkende kracht op. Beantwoord de vraag van die ene build met de hand om hem nu vrij te geven, en stuur de sleutel mee in je volgende archief zodat het nooit meer gevraagd wordt.

Wanneer je de vrijstelling / zelfclassificatie echt nodig hebt

Als stap 4 van de boom klopte — je levert niet-standaard of eigen versleuteling mee — is JA antwoorden niet het einde. Je neemt echte verplichtingen op je onder de EAR:

  • Zelfclassificatie: bepaal de ECCN van je app (doorgaans 5D002) en bevestig dat die in aanmerking komt voor License Exception ENC onder EAR §740.17.
  • Jaarlijks zelfclassificatierapport: voor de meeste massamarkt-apps met versleuteling moet je één keer per jaar een rapport mailen naar BIS en naar de ENC/NSA-coördinator voor versleutelingsverzoeken (het eindejaarsrapport).
  • CCATS: sommige producten hebben eerst een formele classificatie (CCATS) van het Bureau of Industry and Security nodig; App Store Connect vraagt dan om die machtiging.
  • Documentatie in App Store Connect: je geeft de grondslag van je vrijstelling of je CCATS/ERN-gegevens op in het gedeelte versleuteling, per release, tenzij je een compliancecode hebt aangeleverd.

Dit is echt zeldzaam voor consumenten-apps. Gebruik je CryptoKit, Keychain, TLS en niets exotisch, dan ben je vrijgesteld en geldt niets hiervan: antwoord NEE en ga door.

Niet zeker of je crypto vrijgesteld is? Apple verwijst naar het Amerikaanse Bureau of Industry and Security; de praktische toets is «heb ik een versleutelingsalgoritme geïmplementeerd, of roep ik alleen dat van Apple aan / gebruik ik HTTPS?». Het laatste is vrijgesteld.

De veelvoorkomende misser: de sleutel ontbreekt helemaal

Meestal bijt dit niet door een verkeerde waarde, maar door géén waarde. Ontbreekt de sleutel:

  • Elke TestFlight-build belandt in «Missing Compliance» en je testers kunnen hem niet installeren tot je de vraag in App Store Connect beantwoordt — uitnodigingen komen stilletjes niet aan.
  • Een build die je voor de App Store indient gaat niet door naar de beoordeling tot de compliance is opgelost, dus blijft hij stilstaan terwijl jij denkt dat hij in de wachtrij staat.
  • Omdat de vraag bij elke upload terugkeert, loopt een CI/CD-pijplijn die automatisch indient bij elke run vast — het klassieke «waarom hangt TestFlight?».

De oplossing is dezelfde als hierboven: zet ITSAppUsesNonExemptEncryption één keer in Info.plist (als je vrijgesteld bent) zodat geen enkele build ooit nog in de status Missing Compliance komt.

Veelgestelde vragen

Mijn app doet alleen HTTPS-aanroepen. Is die vrijgesteld?

Ja. HTTPS/TLS en de standaardcryptografie die in iOS zit zijn vrijgestelde versleuteling. Zet ITSAppUsesNonExemptEncryption op NO. Dit geldt voor de grote meerderheid van de apps.

Klaart de sleutel op NO zowel TestFlight als de App Store?

Ja — dezelfde Info.plist-waarde voldoet in één keer aan de exportcontrolevraag voor distributie via TestFlight én via de App Store, dus je beslist één keer in plaats van per kanaal.

Ik heb de sleutel gezet maar App Store Connect toont nog steeds Missing Compliance. Hoe kan dat?

Een build die al was geüpload voordat je de sleutel toevoegde pikt hem niet met terugwerkende kracht op. Beantwoord de vraag van die build met de hand in App Store Connect om hem vrij te geven en stuur de sleutel mee in je volgende archief — toekomstige builds vragen het niet meer.

Is NEE antwoorden ooit de verkeerde keuze?

Ja, als je echt niet-vrijgestelde versleuteling meelevert: een eigen algoritme of crypto die gebruikersdata beschermt voorbij HTTPS en de crypto van het besturingssysteem. Dan moet je JA antwoorden en de zelfclassificatie doorlopen (ECCN, License Exception ENC en mogelijk het jaarrapport of een CCATS). Het is een juridische verklaring, dus antwoord naar waarheid.

Wat is het jaarlijkse (eindejaars)rapport over versleuteling?

Voor massamarkt-apps die niet-vrijgestelde versleuteling gebruiken onder License Exception ENC eist de Amerikaanse regelgeving een jaarlijks zelfclassificatierapport, gemaild naar BIS en de ENC-coördinator. Vrijgestelde apps (alleen HTTPS) dienen dat niet in.

Ook interessant: Het privacymanifest van Apple (PrivacyInfo.xcprivacy) · Checklist voor het indienen in de App Store

Bronnen

Controleer je build voordat je indient

Haal je .ipa of .apk door App Review Checker en vang deze problemen op in seconden.

Controleer een app