Du installerer en profil, tunnelen kommer op, og alt ser færdigt ud. Så genstarter telefonen, on-demand vækker forbindelsen uden nogen app i forgrunden, og tunnelen nægter at starte. Profilen er der stadig, og adgangskoden er stadig korrekt, og derfor sender denne fejl folk til at lede det forkerte sted. En Network Extension kan ikke læse din hemmelighed fra profilen: den har brug for en nøgleringreference, som den selv kan opløse.

Gennemgangen nedenfor følger ét forbindelsesforsøg gennem den overdragelse, fra forespørgslen der bygger referencen, til genstarten der tester den.

Profilen gemmer et håndtag, ikke hemmeligheden

NEVPNProtocol eksponerer passwordReference og sharedSecretReference af en grund. Når dæmonen starter en tunnel, kører den måske ikke inde i din proces, så den kan ikke kalde din kode og bede om en adgangskode. Den læser en vedvarende nøgleringreference, opløser den i sin egen kontekst og henter selv elementet.

Du bygger den reference ved at bede nøgleringen om den, hvilket er en anden forespørgsel end at bede om dataene:

let query: [String: Any] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrService as String: "vpn-credentials",
  kSecAttrAccount as String: "user",
  kSecReturnPersistentRef as String: true,
  kSecMatchLimit as String: kSecMatchLimitOne
]

Giv det returnerede objekt til protokollen, ikke elementets data. I praksis registrerer profilen, hvor hemmeligheden bor, og derfor duplikerer en sikkerhedskopi af konfigurationen ikke adgangskoden lydløst til en plist.

Hvorfor API’et svarer -50

errSecParam betyder, at forespørgslen eller værdien var misdannet til operationen, og det er den fejl, man oftest ser, når forespørgslerne om reference og data blandes sammen. At bede om data, mens den modtagende kode forventer en reference, at tildele rå bytes til passwordReference eller at forespørge med en adgangsgruppe, som appen ikke kan bruge, frembringer den alle.

Indpakningsbiblioteker indbyder til det. En hjælper, der returnerer bytes, kan ikke udskiftes med en, der returnerer en reference, så reparationen er normalt en anden forespørgsel snarere end en anden adgangskode.

Den samme uoverensstemmelse forklarer en profil, der gemmes uden klage og derefter ikke kan forbinde: det, der blev gemt, er en blob, ikke et håndtag, og dæmonen har intet at opløse.

Gemmes fint, fejler ved forbindelse

Gemning udøver din apps kontekst. Forbindelse udøver dæmonens, og de to har ikke samme adgang. En profil kan derfor bestå alle tests i simulatoren og fejle ved den første on-demand start.

Det er også formen på genstarts-symptomet: det virker, mens appen er åben, og dør, når systemet selv starter tunnelen.

Test baggrundsvejen med vilje før udgivelse. Udløs en on-demand forbindelse med appen lukket, og læs derefter enhedens konsol i stedet for appens log, fordi fejlen registreres af den proces, der forsøgte at opløse referencen. Hvis konsollen viser, at dæmonen afviser elementet, er referencen fin, og problemet er elementets tilgængelighed.

Tilgængelighed afgør, om en genstart virker

Elementet skal kunne læses af den systemproces, der starter tunnelen, og det er et bredere publikum end din app, mens den er i forgrunden. Den begrænsning vælger tilgængelighedsattributten for dig. Et element, der er beskyttet indtil første oplåsning, er tilgængeligt for en baggrundsstart, efter at enheden er blevet låst op én gang; et element, der kræver, at enheden er låst op lige nu, er ikke.

At vælge den strengere klasse er fristende, og det er netop det, der ødelægger en on-demand profil på en låst telefon.

Når du har ændret klassen, genskab elementet i stedet for at redigere attributter på det eksisterende, og gem derefter protokollen igen med en frisk reference. Attributændringer på et eksisterende element giver ikke altid den adfærd, dokumentationen antyder, og et genopbygget element fjerner tvivlen.

Rotation er, hvor gemte profiler rådner

At ændre adgangskoden i nøgleringen ændrer ikke automatisk, hvad den gemte profil peger på. At slette elementet er værre: profilen beholder en reference til noget, der ikke findes længere, og fejlen ligner en afvisning af godkendelse.

Rotér i én rækkefølge. Opdater elementet, forespørg en ny vedvarende reference, gem protokollen igen, og forbind derefter med appen lukket for at bevise, at dæmonen stadig kan opløse den. Hold brugerens adgangskode og den delte hemmelighed i separate elementer, så hver især roterer efter sin egen plan, og log aldrig forespørgselsordbogen eller referencen selv. Håndtaget er ikke en hemmelighed, men det er et kort til en.

Relaterede artikler