iOS VPN profil: referenca na privjesak ključeva, ne lozinka
Referenca na privjesak ključeva je ručka, a ne tajna. Slanje bajtova objašnjava grešku -50, kvar pri restartu i zamku rotacije u sačuvanim VPN profilima.
Instalirate profil, tunel se podigne i sve izgleda gotovo. Zatim se telefon restartuje, on-demand probudi vezu bez aplikacije u prvom planu, i tunel odbije da se pokrene. Profil je još tu i lozinka je još tačna, zato ovaj kvar navodi ljude da traže na pogrešnom mjestu. Network Extension ne može pročitati vašu tajnu iz profila: potrebna mu je referenca na privjesak ključeva koju može sam razriješiti.
Prikaz ispod prati jedan pokušaj povezivanja kroz to predavanje, od upita koji gradi referencu do restarta koji je provjerava.
Profil čuva ručku, ne tajnu
NEVPNProtocol izlaže passwordReference i sharedSecretReference s razlogom. Kada demon pokrene tunel, možda ne radi unutar vašeg procesa, pa ne može pozvati vaš kod i tražiti lozinku. Čita trajnu referencu na privjesak ključeva, razrješava je u svom kontekstu i sam dohvata stavku.
Tu referencu gradite tako što je tražite od privjeska ključeva, a to je drugačiji zahtjev od zahtjeva za podacima:
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
]Predajte vraćeni objekat protokolu, ne podatke stavke. U praksi profil bilježi gdje tajna živi, zato ni rezervna kopija konfiguracije ne duplira lozinku tiho u plist.
Zašto API odgovara sa -50
errSecParam znači da su zahtjev ili vrijednost bili neispravni za tu operaciju, i to je greška koja se najčešće viđa kada se zahtjevi za referencom i podacima pomiješaju. Traženje podataka dok kod koji prima očekuje referencu, dodjeljivanje sirovih bajtova polju passwordReference ili upit s pristupnom grupom koju aplikacija ne može koristiti, sve to je proizvodi.
Biblioteke-omotači na to pozivaju. Pomoćnik koji vraća bajtove nije zamjenjiv s onim koji vraća referencu, pa je popravka obično drugačiji upit, a ne drugačija lozinka.
Ista neusklađenost objašnjava profil koji se čuva bez pritužbe i zatim ne može da se poveže: ono što je sačuvano je blob, a ne ručka, i demon nema šta razriješiti.
Čuva se dobro, pada pri povezivanju
Čuvanje vježba kontekst vaše aplikacije. Povezivanje vježba demonov, a njih dvoje nemaju isti pristup. Profil zato može proći svaki test u simulatoru i pasti na prvom on-demand pokretanju.
To je i oblik simptoma pri restartu: radi dok je aplikacija otvorena i umire kada sistem sam pokrene tunel.
Testirajte pozadinski put namjerno prije isporuke. Izazovite on-demand vezu s aplikacijom zatvorenom, pa čitajte konzolu uređaja, a ne dnevnik aplikacije, jer kvar bilježi proces koji je pokušao razriješiti referencu. Ako konzola pokaže da demon odbija stavku, referenca je u redu i problem je u dostupnosti stavke.
Dostupnost odlučuje hoće li restart raditi
Stavka mora biti čitljiva onom sistemskom procesu koji pokrene tunel, a to je šira publika od vaše aplikacije dok je u prvom planu. To ograničenje samo bira atribut dostupnosti. Stavka zaštićena do prvog otključavanja dostupna je za pozadinsko pokretanje nakon što je uređaj jednom otključan; stavka koja zahtijeva da uređaj bude otključan upravo sada nije.
Biranje strože klase je primamljivo i upravo ono kvari on-demand profil na zaključanom telefonu.
Nakon promjene klase ponovo kreirajte stavku umjesto da mijenjate atribute na postojećoj, pa ponovo sačuvajte protokol sa svježom referencom. Promjene atributa na postojećoj stavci ne daju uvijek ponašanje koje dokumentacija implicira, a obnovljena stavka uklanja sumnju.
Rotacija je mjesto gdje sačuvani profili trunu
Promjena lozinke u privjesku ključeva ne mijenja automatski ono na šta sačuvani profil pokazuje. Brisanje stavke je gore: profil drži referencu na nešto što više ne postoji, a kvar izgleda kao odbijanje autentifikacije.
Rotirajte u jednom redu. Ažurirajte stavku, zatražite novu trajnu referencu, ponovo sačuvajte protokol, pa se povežite s aplikacijom zatvorenom da dokažete da je demon još može razriješiti. Držite korisničku lozinku i zajedničku tajnu u odvojenim stavkama da se svaka rotira po svom rasporedu, i nikad ne logujte rječnik upita ni samu referencu. Ručka nije tajna, ali jeste mapa do nje.