Profil VPN v iOS: passwordReference, nie heslo
Odkaz do zväzku kľúčov je úchyt, nie tajomstvo. Prenos bajtov vysvetľuje chybu -50, zlyhanie po reštarte a pascu rotácie v uložených profiloch VPN.
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.