iOS VPN profilis: passwordReference, o ne slaptažodis
Raktų saugyklos nuoroda yra rankena, o ne paslaptis. Baitų perdavimas paaiškina -50 klaidą, perkrovimo nesėkmę ir rotacijos spąstus išsaugotuose VPN profiliuose.
Įdiegiate profilį, tunelis pakyla ir viskas atrodo baigta. Tada telefonas persikrauna, on-demand pažadina ryšį be programos priekiniame plane, ir tunelis atsisako startuoti. Profilis vis dar yra, o slaptažodis vis dar teisingas, todėl šis gedimas nukreipia žmones ieškoti ne ten. Network Extension negali perskaityti jūsų paslapties iš profilio: jam reikia raktų saugyklos nuorodos, kurią jis pats gali išspręsti.
Žemiau pateikta eiga seka vieną ryšio bandymą per tą perdavimą, nuo užklausos, kuri sukuria nuorodą, iki perkrovimo, kuris ją išbando.
Profilyje saugoma rankena, o ne paslaptis
NEVPNProtocol atskleidžia passwordReference ir sharedSecretReference ne be priežasties. Kai demonas paleidžia tunelį, jis gali neveikti jūsų procese, todėl negali iškviesti jūsų kodo ir paprašyti slaptažodžio. Jis nuskaito nuolatinę raktų saugyklos nuorodą, išsprendžia ją savo kontekste ir pats paima elementą.
Tą nuorodą kuriate paprašydami jos raktų saugyklos, ir tai yra kita užklausa nei duomenų užklausa:
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
]Grąžintą objektą perduokite protokolui, o ne elemento duomenis. Praktiškai profilyje įrašoma, kur gyvena paslaptis, todėl konfigūracijos atsarginė kopija tyliai nedubliuoja slaptažodžio į plist.
Kodėl API atsako -50
errSecParam reiškia, kad užklausa arba reikšmė buvo netinkamos formos šiai operacijai, ir tai klaida, kuri matoma dažniausiai, kai sumaišomos nuorodos ir duomenų užklausos. Duomenų prašymas, kai priimantis kodas laukia nuorodos, neapdorotų baitų priskyrimas passwordReference laukui arba užklausa su prieigos grupe, kurios programa negali naudoti, visi ją sukuria.
Apvalkalų bibliotekos prie to kviečia. Pagalbinė funkcija, grąžinanti baitus, nėra keičiama su ta, kuri grąžina nuorodą, todėl pataisymas paprastai yra kita užklausa, o ne kitas slaptažodis.
Tas pats neatitikimas paaiškina profilį, kuris išsaugomas be priekaištų ir po to neprisijungia: išsaugotas yra blob, o ne rankena, ir demonas neturi ko išspręsti.
Išsaugoma gerai, nepavyksta jungiantis
Išsaugojimas išbando jūsų programos kontekstą. Prisijungimas išbando demono, ir abu neturi vienodų teisių. Todėl profilis gali praeiti visus simuliatoriuje atliktus testus ir nepavykti pirmojo on-demand paleidimo metu.
Tokia pati yra perkrovimo simptomo forma: veikia, kol programa atidaryta, ir miršta, kai sistema pati paleidžia tunelį.
Išbandykite foninį kelią sąmoningai prieš išleisdami. Sužadinkite on-demand ryšį su uždaryta programa, tada skaitykite įrenginio konsolę, o ne programos žurnalą, nes gedimą įrašo procesas, kuris bandė išspręsti nuorodą. Jei konsolė rodo, kad demonas atmeta elementą, nuoroda gera, o problema yra elemento pasiekiamumas.
Pasiekiamumas nusprendžia, ar perkrovimas veiks
Elementas turi būti skaitomas bet kurio sistemos proceso, kuris paleidžia tunelį, o tai platesnė auditorija nei jūsų programa priekiniame plane. Šis apribojimas parenka pasiekiamumo atributą už jus. Elementas, apsaugotas iki pirmo atrakinimo, yra prieinamas foniniam paleidimui po to, kai įrenginys buvo atrakintas vieną kartą; elementas, reikalaujantis, kad įrenginys būtų atrakintas dabar, nėra.
Rinktis griežtesnę klasę vilioja, ir būtent tai sugadina on-demand profilį užrakintame telefone.
Pakeitę klasę, sukurkite elementą iš naujo, o ne redaguokite esamo atributus, tada dar kartą išsaugokite protokolą su nauja nuoroda. Atributų pakeitimai esamame elemente ne visada duoda elgseną, kurią numato dokumentacija, o perstatytas elementas pašalina abejones.
Rotacija yra ten, kur pūva išsaugoti profiliai
Slaptažodžio pakeitimas raktų saugykloje automatiškai nepakeičia to, į ką nukreipia išsaugotas profilis. Elemento ištrynimas yra blogiau: profilis laiko nuorodą į tai, ko nebėra, ir gedimas atrodo kaip autentifikavimo atmetimas.
Sukite viena tvarka. Atnaujinkite elementą, užklauskite naują nuolatinę nuorodą, dar kartą išsaugokite protokolą, tada prisijunkite su uždaryta programa, kad įrodytumėte, jog demonas vis dar gali ją išspręsti. Laikykite naudotojo slaptažodį ir bendrą paslaptį atskiruose elementuose, kad kiekvienas suktųsi pagal savo grafiką, ir niekada neregistruokite užklausos žodyno ar pačios nuorodos. Rankena nėra paslaptis, bet tai žemėlapis į ją.