Šta NEVPNManager može stvoriti na iOS-u (a šta ne može)
iOS VPN API gradi jednu konfiguraciju koja pripada aplikaciji od tri klase protokola. L2TP, PPTP i potpisani profili nisu dio te površine.
Napravite VPN ekran unutar iOS aplikacije i prvo iznenađenje je da lista protokola u aplikaciji Postavke nije lista API-ja. Network Extension okvir dopušta vašoj aplikaciji da stvori jednu ličnu VPN konfiguraciju koja pripada toj aplikaciji, a prihvata samo nekoliko protokolskih objekata. Sve ostalo što ljudi očekuju, od L2TP-a do preuzetog profila, nalazi se izvan te površine ili je Applov privatni dio. Neuspjesi koji slijede obično nisu greške; to je API koji odbija posao koji mu nikada nije dat.
Mit: API nije uređivač Postavki
Uvjerenje je da, budući da iOS može konfigurisati profile IKEv1, IKEv2, L2TP i IPsec, aplikacija može stvoriti bilo koji od njih programski. Ne može. Okvir izlaže točno jedno mjesto za konfiguraciju aplikaciji koja ga poziva, a to mjesto prihvata mali skup javnih klasa protokola. Sve ostalo što ljudi očekuju, od L2TP-a do preuzetog profila, nalazi se izvan te površine ili je Applov privatni dio.
Neuspjesi koji slijede obično nisu greške. To je API koji odbija posao koji mu nikada nije dat, a rješenje je dizajnirati ekran oko onoga što API posjeduje.
Tri protokolska objekta i oni koji ne postoje
Vaše opcije su IKEv1 preko NEVPNProtocolIPSec, IKEv2 preko NEVPNProtocolIKEv2 i NETunnelProviderProtocol ako isporučujete vlastito proširenje paketnog tunela. Referenca NEVPNManager navodi prihvaćene protokolske objekte. L2TP i PPTP se nikada ne pojavljuju na toj listi jer Apple za njih nije objavio nikakve klase. Pokušaj bilo kojeg završava pri spremanju greškom ili, još gore, konfiguracijom koju sistem tiho odbija koristiti.
Kod za stolna računala slijedi drugačija pravila. Na macOS-u SCNetworkInterfaceCreateWithInterface slaže tip interfejsa kao što je L2TP preko IPv4 i pripaja ga mrežnoj usluzi, a networksetup -connectpppoeservice pokreće rezultat. Potrebna su administratorska prava i pomoćni alat, jer zajednička tajna i lozinka idu u sistemski privjesak ključeva. Prenesite taj dizajn na iOS i ništa se ne kompajlira.
Proslijedite referencu privjeska ključeva, ne lozinku
Nijedna IKE klasa ne prihvata lozinku kao tekst. Dva svojstva passwordReference i sharedSecretReference traže trajnu referencu privjeska ključeva, koju dobijate iz SecItemCopyMatching tražeći kSecReturnPersistentRef. Prosljeđivanje podataka stavke ili nasilno ubacivanje niza u polje daje neuspjeh spremanja ili vezu s praznim vjerodajnicama. Referenca je trajna samo onoliko koliko je trajna stavka privjeska iza nje, zato stavka mora postojati prije sastavljanja konfiguracije. Stvorite je u istoj transakciji kao i spremanje i uklanjate cijelu klasu grešaka u redoslijedu.
Autentifikacija certifikatom ide drugim putem: identityData plus identityDataPassword za PKCS#12 blob. Isporuka tog bloba unutar paketa aplikacije navika je prenesena iz primjernog koda, a ne odluka za izdanje, jer lozinka putuje s njim i svaka kopija aplikacije nosi isti identitet.
Pravo i dostupnost određuju sve
Menadžer možda uopće ne postoji, a razlog je provizioniranje. Identifikator vaše aplikacije treba mogućnost Network Extension zajedno s pravom za lični VPN, a profil koji potpisuje build mora nositi oboje.
Preskočite to i zajednička instanca vraća nil, ili spremanje ne uspije s greškom koja nikada ne spominje pravo. Dostupnost je druga kapija. Ciljajte bilo šta starije od iOS 8 i simbol nedostaje u izvršavanju, pa je neuspjeh pad ili menadžer s vrijednošću nil, a ne menadžer bez konfiguracije. Provjerite okruženje izvršavanja i pravo prije nego što otklanjate greške u grafu objekata.
Učitajte, izmijenite, spremite, pa pazite na redoslijed na zahtjev
Tretirajte životni ciklus kao učitavanje, izmjenu, spremanje i nikada ne preskačite učitavanje. Dok loadFromPreferences ne završi, menadžer ne drži ništa i protokolski objekat se ne može čitati ni zamijeniti.
Drugo spremanje zamjenjuje konfiguraciju umjesto da dodaje još jednu, pa nedovršeno spremanje može oštetiti profil koji je radio. Pravila na zahtjev čine uređeni niz, a taj redoslijed je politika. Stavite pravilo povezivanja s bilo kojeg mjesta ispred pravila za prekid i ručni prekid slijedi trenutno ponovno povezivanje, što izgleda kao defekt ali slijedi dokumentovanu evaluaciju.
Pomjerite pravilo za prekid naprijed kada korisnička radnja mora pobijediti. Ono što ostaje izvan kontrole aplikacije jednako je važno. Rute dolaze iz tunela ili iz serverske politike, a ne iz postavke koju vi zadajete, pri čemu pružalac paketnog tunela prijavljuje ih pri pokretanju. Aplikacija ne može izlistati ni urediti profile koje su instalirale druge aplikacije ili profili konfiguracije, zato ne obećavajte ekran koji prikazuje svaki VPN na uređaju.