Nainstalujete profil, tunel se zvedne a všechno vypadá hotové. Pak se telefon restartuje, on-demand probudí spojení bez aplikace v popředí a tunel odmítne nastartovat. Profil je pořád tam a heslo je pořád správné, a proto tento problém posílá lidi hledat na špatné místo. Network Extension nedokáže vaše tajemství z profilu přečíst: potřebuje odkaz do klíčenky, který dokáže samo vyřešit.

Následující průchod sleduje jeden pokus o spojení přes toto předání, od dotazu, který odkaz sestaví, až po restart, který ho otestuje.

Profil ukládá úchyt, ne tajemství

NEVPNProtocol vystavuje passwordReference a sharedSecretReference z nějakého důvodu. Když démon spouští tunel, nemusí běžet ve vašem procesu, takže nemůže zavolat váš kód a požádat o heslo. Přečte trvalý odkaz do klíčenky, vyřeší ho ve svém kontextu a položku si obstará sám.

Tento odkaz sestavíte tak, že o něj klíčenku požádáte; to je jiný požadavek než žádost o data:

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ácený objekt předejte protokolu, ne data položky. V praxi profil zaznamenává, kde tajemství žije, a proto záloha konfigurace heslo potichu nezkopíruje do plistu.

Proč API odpovídá -50

errSecParam znamená, že požadavek nebo hodnota byly pro operaci chybně utvořené, a je to chyba, kterou vidíte nejčastěji, když se požadavky na odkaz a na data popletou. Žádost o data, když přijímající kód očekává odkaz, přiřazení surových bajtů do passwordReference nebo dotaz s přístupovou skupinou, kterou aplikace nemůže použít, všechny ji vyvolají.

Obalové knihovny k tomu svádějí. Pomocník, který vrací bajty, není zaměnitelný s tím, který vrací odkaz, takže opravou bývá jiný dotaz, ne jiné heslo.

Stejný nesoulad vysvětluje profil, který se uloží bez stížnosti a pak se nepřipojí: uložené je blob, ne úchyt, a démon nemá co vyřešit.

Uloží se dobře, selže při připojení

Ukládání procvičuje kontext vaší aplikace. Připojování procvičuje kontext démona a oba nemají stejný přístup. Profil proto může projít každým testem v simulátoru a selhat při prvním on-demand startu.

Takový je i tvar příznaku po restartu: funguje, dokud je aplikace otevřená, a umře, když systém spustí tunel sám.

Cestu na pozadí testujte záměrně před vydáním. Vyvolejte on-demand spojení se zavřenou aplikací a pak čtěte konzoli zařízení, ne log aplikace, protože selhání zapisuje proces, který se pokusil odkaz vyřešit. Pokud konzole ukáže, že démon položku odmítá, odkaz je v pořádku a problém je v dostupnosti položky.

Dostupnost rozhoduje, zda restart funguje

Položka musí být čitelná pro kterýkoli systémový proces, který tunel spustí, a to je širší publikum než vaše aplikace v popředí. Toto omezení za vás vybírá atribut dostupnosti. Položka chráněná do prvního odemčení je dostupná pro start na pozadí poté, co bylo zařízení jednou odemčeno; položka, která vyžaduje odemčené zařízení právě teď, dostupná není.

Volba přísnější třídy je lákavá a přesně ta rozbíjí on-demand profil na zamčeném telefonu.

Po změně třídy položku znovu vytvořte, místo abyste upravovali atributy u existující, a pak protokol znovu uložte s čerstvým odkazem. Změny atributů u existující položky ne vždy přinesou chování, které dokumentace naznačuje, a znovu vytvořená položka pochybnost odstraní.

Rotace je místo, kde uložené profily hnijí

Změna hesla v klíčence automaticky nezmění to, na co uložený profil ukazuje. Smazání položky je horší: profil si drží odkaz na něco, co už neexistuje, a selhání vypadá jako odmítnutí autentizace.

Rotujte v jednom pořadí. Aktualizujte položku, vyžádejte nový trvalý odkaz, znovu uložte protokol a pak se připojte se zavřenou aplikací, abyste dokázali, že démon ho ještě dokáže vyřešit. Uživatelské heslo a sdílené tajemství držte v oddělených položkách, aby se každé rotovalo podle svého plánu, a nikdy nelogujte slovník dotazu ani samotný odkaz. Úchyt není tajemství, ale je to mapa k němu.

Související články