Pin of geen pin: de afweging rond certificate pinning in mobiele apps
Certificate pinning klinkt als de heilige graal voor een veilige mobiele app. Je app vertrouwt dan niet langer elke Certificate Authority die Android of iOS standaard vertrouwt, maar alleen een vooraf goedgekeurde set publieke sleutels. Een aanvaller met een frauduleus uitgegeven of lokaal geïnstalleerd root-certificaat heeft dan geen schijn van kans. Toch raadt de Android Developers documentatie het expliciet af, vooral vanwege de operationele risico’s wanneer een serverconfiguratie wijzigt. Een toekomstige wijziging van CA of een certificaatrotatie kan de app compleet onbereikbaar maken, en een fix vereist een app-store update die gebruikers pas installeren wanneer zij dat zelf willen.
Waarom pinning verleidelijk blijft
Standaard TLS-validatie leunt op de trust store van het besturingssysteem. Daarin zitten meer dan honderd root CA’s. Als één van die CA’s wordt gecompromitteerd, of als malware of een bedrijfsproxy een extra root-CA op het toestel plaatst, kan een aanvaller een geldig lijkend certificaat presenteren voor jouw API. Voor een bankapp, een zorgapp of een applicatie die industriële besturingen aanstuurt is dat onacceptabel. OWASP classificeert identity pinning dan ook als MASVS-NETWORK level 2 controle, aanbevolen voor apps die gevoelige data verwerken.
De twee gouden regels
Wie toch pint, moet zich aan twee regels houden. De eerste is: pin publieke sleutels, niet certificaten. Een certificaat wisselt elke 60 tot 90 dagen bij automatische leveranciers zoals Let’s Encrypt, maar de onderliggende key pair kan statisch blijven. De hash van de SubjectPublicKeyInfo, afgekort SPKI, is je pin. Genereer die met OpenSSL:
openssl s_client -connect api.jouwdomein.nl:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl base64
De tweede is: voeg altijd een backup pin toe. Dat is een tweede sleutelpaar dat je offline bewaart en nog niet in productie hangt. Wanneer je moet roteren, zet je het backup-paar op de server en vertrouwt de app er al op, geen update nodig. Pas in een volgende release introduceer je een nieuwe backup en verwijder je de oude primary.
Bedenk ook dat pinning een verdedigingslinie is, geen ondoordringbare muur. Een aanvaller met root op het toestel kan de APK herpakken, de pins aanpassen en de app opnieuw signeren. Daarom hoort pinning thuis in een bredere strategie met Play Integrity, rootdetectie, obfuscatie en runtime checks.



