Nainštalujete profil, tunel sa zdvihne a všetko vyzerá hotové. Potom sa telefón reštartuje, on-demand zobudí spojenie bez aplikácie v popredí a tunel odmietne naštartovať. Profil je stále tam a heslo je stále správne, a preto tento problém posiela ľudí hľadať na nesprávnom mieste. Network Extension nedokáže prečítať vaše tajomstvo z profilu: potrebuje odkaz do zväzku kľúčov, ktorý dokáže samo vyriešiť.

Následný prechod sleduje jeden pokus o spojenie cez toto odovzdanie, od dopytu, ktorý zostaví odkaz, až po reštart, ktorý ho otestuje.

Profil ukladá úchyt, nie tajomstvo

NEVPNProtocol sprístupňuje passwordReference a sharedSecretReference z nejakého dôvodu. Keď démon spúšťa tunel, nemusí bežať vo vašom procese, takže nemôže zavolať váš kód a požiadať o heslo. Prečíta trvalý odkaz do zväzku kľúčov, vyrieši ho vo svojom kontexte a položku si obstará sám.

Tento odkaz zostavíte tak, že oň zväzok kľúčov požiadate; je to iná požiadavka než žiadosť o dáta:

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
]

Vrátený objekt odovzdajte protokolu, nie dáta položky. V praxi profil zaznamenáva, kde tajomstvo žije, a preto záloha konfigurácie potichu neduplikuje heslo do plistu.

Prečo API odpovedá -50

errSecParam znamená, že požiadavka alebo hodnota boli pre túto operáciu nesprávne vytvorené, a je to chyba, ktorá sa vidí najčastejšie, keď sa požiadavky na odkaz a na dáta pomýlia. Žiadosť o dáta, kým prijímajúci kód očakáva odkaz, priradenie surových bajtov do passwordReference alebo dopyt s prístupovou skupinou, ktorú aplikácia nemôže použiť, všetky ju vyvolajú.

Obalové knižnice k tomu lákajú. Pomocník, ktorý vracia bajty, nie je zameniteľný s tým, ktorý vracia odkaz, takže opravou býva iný dopyt, nie iné heslo.

Rovnaký nesúlad vysvetľuje profil, ktorý sa uloží bez sťažnosti a potom sa nepripojí: uložené je blob, nie úchyt, a démon nemá čo vyriešiť.

Uloží sa dobre, zlyhá pri pripojení

Ukladanie precvičuje kontext vašej aplikácie. Pripájanie precvičuje kontext démona a oba nemajú rovnaký prístup. Profil preto môže prejsť každým testom v simulátore a zlyhať pri prvom on-demand štarte.

Taký je aj tvar príznaku po reštarte: funguje, kým je aplikácia otvorená, a umrie, keď systém spustí tunel sám.

Cestu na pozadí otestujte zámerne pred vydaním. Vyvolajte on-demand spojenie so zatvorenou aplikáciou a potom čítajte konzolu zariadenia, nie log aplikácie, pretože zlyhanie zapisuje proces, ktorý sa pokúsil vyriešiť odkaz. Ak konzola ukazuje, že démon položku odmieta, odkaz je v poriadku a problémom je dostupnosť položky.

Dostupnosť rozhoduje, či reštart funguje

Položka musí byť čitateľná pre ktorýkoľvek systémový proces, ktorý tunel spustí, a to je širšie publikum než vaša aplikácia v popredí. Toto obmedzenie za vás vyberá atribút dostupnosti. Položka chránená do prvého odomknutia je dostupná pre štart na pozadí po tom, čo bolo zariadenie raz odomknuté; položka, ktorá vyžaduje odomknuté zariadenie práve teraz, dostupná nie je.

Voľba prísnejšej triedy je lákavá a práve tá pokazí on-demand profil na zamknutom telefóne.

Po zmene triedy položku znova vytvorte, namiesto úpravy atribútov na existujúcej, a potom protokol znova uložte s čerstvým odkazom. Zmeny atribútov na existujúcej položke nie vždy prinášajú správanie, ktoré dokumentácia naznačuje, a znova vytvorená položka pochybnosť odstráni.

Rotácia je miesto, kde uložené profily hnijú

Zmena hesla vo zväzku kľúčov automaticky nezmení to, na čo uložený profil ukazuje. Vymazanie položky je horšie: profil si drží odkaz na niečo, čo už neexistuje, a zlyhanie vyzerá ako odmietnutie autentifikácie.

Rotujte v jednom poradí. Aktualizujte položku, vyžiadajte nový trvalý odkaz, znova uložte protokol a potom sa pripojte so zatvorenou aplikáciou, aby ste dokázali, že démon ho ešte dokáže vyriešiť. Držte používateľské heslo a zdieľané tajomstvo v oddelených položkách, aby sa každé rotovalo podľa vlastného plánu, a nikdy nelogujte slovník dopytu ani samotný odkaz. Úchyt nie je tajomstvo, ale je to mapa k nemu.

Súvisiace články