Čo dokáže NEVPNManager vytvoriť v iOS (a čo nie)
VPN API v iOS zostavuje jednu konfiguráciu vo vlastníctve aplikácie z troch tried protokolov. L2TP, PPTP a podpísané profily nie sú súčasťou tohto povrchu.
Keď vytvárate VPN obrazovku v aplikácii iOS, prvým prekvapením je, že zoznam protokolov v aplikácii Nastavenia nie je zoznamom API. Rámec Network Extension umožňuje vašej aplikácii vytvoriť jednu osobnú VPN konfiguráciu, ktorá patrí tejto aplikácii, a prijíma len niekoľko protokolových objektov. Všetko ostatné, čo ľudia očakávajú, od L2TP po stiahnutý profil, sa nachádza mimo tohto povrchu alebo je súkromné pre Apple. Zlyhania, ktoré nasledujú, zvyčajne nie sú chyby, je to API, ktoré odmieta prácu, ktorú nikdy nedostalo.
Mýtus: API je editor Nastavení
Verí sa, že keďže iOS dokáže konfigurovať profily IKEv1, IKEv2, L2TP a IPsec, aplikácia môže ktorýkoľvek z nich vytvoriť programovo. Nedokáže. Rámec sprístupňuje volajúcej aplikácii presne jedno miesto konfigurácie a toto miesto prijíma len malú množinu verejných tried protokolov. Všetko ostatné, čo ľudia očakávajú, od L2TP po stiahnutý profil, sa nachádza mimo tohto povrchu alebo je súkromné pre Apple.
Zlyhania, ktoré nasledujú, zvyčajne nie sú chyby. Je to API, ktoré odmieta prácu, ktorú nikdy nedostalo, a riešením je navrhnúť obrazovku okolo toho, čo API vlastní.
Tri protokolové objekty a tie, ktoré neexistujú
Vaše možnosti sú IKEv1 cez NEVPNProtocolIPSec, IKEv2 cez NEVPNProtocolIKEv2 a NETunnelProviderProtocol, ak dodávate vlastné rozšírenie paketového tunela. Referencia NEVPNManager uvádza akceptované protokolové objekty. L2TP a PPTP sa v tomto zozname nikdy neobjavia, pretože Apple pre ne nezverejnil žiadne triedy. Pokus o ktorýkoľvek z nich sa pri ukladaní skončí chybou alebo, čo je horšie, konfiguráciou, ktorú systém potichu odmieta použiť.
Desktopový kód sa riadi inými pravidlami. V macOS SCNetworkInterfaceCreateWithInterface naskladá typ rozhrania, napríklad L2TP cez IPv4, a pripojí ho k sieťovej službe, a networksetup -connectpppoeservice spustí výsledok. Vyžadujú sa administrátorské práva a pomocný nástroj, pretože zdieľané tajomstvo a heslo idú do systémovej kľúčenky. Skopírujte tento dizajn na iOS a nič sa nezkompiluje.
Odovzdajte referenciu do kľúčenky, nie heslo
Ani jedna z dvoch tried IKE neprijíma heslo ako text. Dve vlastnosti passwordReference a sharedSecretReference chcú trvalú referenciu do kľúčenky, ktorú získate z SecItemCopyMatching požiadaním o kSecReturnPersistentRef. Odovzdanie údajov položky alebo vloženie reťazca do poľa spôsobí zlyhanie ukladania alebo pripojenie s prázdnymi prihlasovacími údajmi. Referencia je trvalá len tak, ako položka kľúčenky za ňou, preto musí položka existovať pred zostavením konfigurácie. Vytvorte ju v tej istej transakcii ako ukladanie a odstránite celú triedu chýb poradia.
Autentifikácia certifikátom ide inou cestou: identityData plus identityDataPassword pre blob PKCS#12. Dodanie tohto blobu v balíku aplikácie je zvyk prevzatý z ukážkového kódu, nie rozhodnutie o vydaní, pretože heslo cestuje s ním a každá kópia aplikácie nesie rovnakú identitu.
Oprávnenie a dostupnosť bránia všetkému
Správca nemusí vôbec existovať a dôvodom je provisioning. Identifikátor vašej aplikácie potrebuje schopnosť Network Extension spolu s oprávnením na osobný VPN a profil, ktorý podpisuje build, musí niesť obe.
Preskočte to a zdieľaná inštancia vráti nil, alebo ukladanie zlyhá s chybou, ktorá nikdy nespomenie oprávnenie. Dostupnosť je druhá brána. Ak cielite na niečo staršie ako iOS 8, symbol pri behu chýba, takže zlyhanie je zrútenie alebo nil správca, nie správca bez konfigurácie. Skontrolujte behové prostredie a oprávnenie pred ladením grafu objektov.
Načítajte, upravte, uložte a potom sledujte poradie na požiadanie
Berte životný cyklus ako načítanie, úpravu a uloženie a nikdy nevynechajte načítanie. Kým sa loadFromPreferences nedokončí, správca nič nedrží a protokolový objekt nemožno čítať ani nahradiť.
Druhé uloženie nahradí konfiguráciu namiesto pridania ďalšej, takže neúplné uloženie môže poškodiť profil, ktorý fungoval. Pravidlá na požiadanie tvoria usporiadané pole a toto poradie je politikou. Dajte pravidlo pripojenia odkiaľkoľvek pred pravidlo odpojenia a po manuálnom odpojení nasleduje okamžité opätovné pripojenie, čo vyzerá ako defekt, ale zodpovedá zdokumentovanému hodnoteniu.
Presuňte pravidlo odpojenia dopredu, keď musí zvíťaziť akcia používateľa. To, čo zostáva mimo kontroly aplikácie, je rovnako dôležité. Trasy prichádzajú z tunela alebo zo serverovej politiky, nie z preferencie, ktorú nastavíte, pričom poskytovateľ paketového tunela o nich informuje pri štarte. Aplikácia nemôže vypísať ani upraviť profily nainštalované inými aplikáciami alebo konfiguračnými profilmi, preto nesľubujte obrazovku, ktorá zobrazuje každý VPN v zariadení.