Co NEVPNManager umí na iOS vytvořit (a co ne)
iOS VPN API sestavuje jednu konfiguraci vlastněnou aplikací ze tří tříd protokolů. L2TP, PPTP a podepsané profily do této plochy nepatří.
Postavte v iOS aplikaci obrazovku VPN a první překvapení je, že seznam protokolů v aplikaci Nastavení není seznamem API. Framework Network Extension umožňuje aplikaci vytvořit jednu osobní VPN konfiguraci vlastněnou touto aplikací a přijímá jen několik objektů protokolu. Všechno ostatní, co lidé čekají, od L2TP po stažený profil, leží mimo tuto plochu nebo je soukromé Applu. Selhání, která následují, obvykle nejsou chyby: je to API, které odmítá úlohu, kterou nikdy nedostalo.
Mýtus: API není editor Nastavení
Věří se, že když iOS umí konfigurovat profily IKEv1, IKEv2, L2TP a IPsec, aplikace dokáže kterýkoli z nich vytvořit programově. Nedokáže. Framework vystavuje volající aplikaci přesně jeden konfigurační slot a ten přijímá malou sadu veřejných tříd protokolu. Všechno ostatní, co lidé čekají, od L2TP po stažený profil, leží mimo tuto plochu nebo je soukromé Applu.
Selhání, která následují, obvykle nejsou chyby. Jsou to API, které odmítá úlohu, kterou nikdy nedostalo, a řešením je navrhnout obrazovku kolem toho, co API vlastní.
Tři objekty protokolu a ty, které neexistují
Vaše možnosti jsou IKEv1 přes NEVPNProtocolIPSec, IKEv2 přes NEVPNProtocolIKEv2 a NETunnelProviderProtocol, pokud dodáváte vlastní rozšíření paketového tunelu. Referenční příručka NEVPNManager uvádí přijímané objekty protokolu. L2TP a PPTP se v tomto seznamu nikdy neobjeví, protože pro ně Apple žádné třídy nepublikoval. Pokus o kterýkoli z nich skončí při ukládání chybou nebo, hůř, konfigurací, kterou systém tiše odmítá použít.
Kód pro počítače se řídí jinými pravidly. V macOS SCNetworkInterfaceCreateWithInterface skládá typ rozhraní, například L2TP přes IPv4, a připojuje jej k síťové službě a networksetup -connectpppoeservice spustí výsledek. Jsou potřeba práva správce a pomocný nástroj, protože sdílené tajemství a heslo jdou do systémové klíčenky. Přeneste tento návrh na iOS a nic se nezkompiluje.
Předejte odkaz do klíčenky, ne heslo
Žádná třída IKE nepřijímá heslo jako text. Obě vlastnosti passwordReference a sharedSecretReference chtějí trvalý odkaz do klíčenky, který získáte z SecItemCopyMatching žádostí o kSecReturnPersistentRef. Předání dat položky nebo vynucené vložení řetězce do pole vede k selhání ukládání nebo k připojení s prázdnými přihlašovacími údaji. Odkaz je trvanlivý jen tak, jako položka klíčenky za ním, a proto musí položka existovat dřív, než se konfigurace sestaví. Vytvořte ji ve stejné transakci jako uložení a odstraníte celou třídu chyb v pořadí.
Ověřování certifikátem jde jinou cestou: identityData plus identityDataPassword pro blob PKCS#12. Dodávat tento blob uvnitř balíčku aplikace je zvyk převzatý z ukázkového kódu, ne rozhodnutí pro vydání, protože heslo cestuje s ním a každá kopie aplikace nese stejnou identitu.
Nárok a dostupnost určují všechno
Správce nemusí vůbec existovat a důvodem je provisioning. Identifikátor vaší aplikace potřebuje schopnost Network Extension spolu s nárokem na osobní VPN a profil, který podepisuje build, musí nést obojí.
Přeskočte to a sdílená instance vrátí nil, nebo uložení selže s chybou, která nárok nikdy nezmíní. Dostupnost je druhá brána. Cílete na cokoli staršího než iOS 8 a symbol při běhu chybí, takže selháním je pád nebo správce s hodnotou nil, ne správce bez konfigurace. Zkontrolujte běhové prostředí a nárok, než začnete ladit graf objektů.
Načtěte, upravte, uložte a pak sledujte pořadí na vyžádání
Berte životní cyklus jako načtení, úpravu a uložení a načtení nikdy nepřeskakujte. Dokud se loadFromPreferences nedokončí, správce nic nedrží a objekt protokolu nelze číst ani vyměnit.
Druhé uložení nahradí konfiguraci místo přidání další, takže nedokončené uložení může poškodit profil, který fungoval. Pravidla na vyžádání tvoří uspořádané pole a toto pořadí je politikou. Dejte pravidlo připojení odkudkoli před pravidlo odpojení a po ručním odpojení následuje okamžité opětovné připojení, což vypadá jako defekt, ale odpovídá dokumentovanému vyhodnocení.
Přesuňte pravidlo odpojení na začátek, když má akce uživatele vyhrát. Co zůstává mimo kontrolu aplikace, je stejně důležité. Trasy přicházejí z tunelu nebo ze serverové politiky, ne z předvolby, kterou nastavíte, a poskytovatel paketového tunelu je hlásí při startu. Aplikace nemůže vypsat ani upravit profily nainstalované jinými aplikacemi nebo konfiguračními profily, takže neslibujte obrazovku, která ukazuje každou VPN v zařízení.