Kai kuriate VPN ekraną iOS programoje, pirmas netikėtumas yra tai, kad Nustatymų programos protokolų sąrašas nėra API sąrašas. Network Extension sistema leidžia programai sukurti vieną asmeninę VPN konfigūraciją, priklausančią tai programai, ir ji priima tik kelis protokolo objektus. Visa kita, ko žmonės tikisi, nuo L2TP iki atsisiųsto profilio, yra už šio paviršiaus arba Apple privatu. Vėlesnės klaidos paprastai nėra programinės klaidos, tai API atsisako darbo, kurio jai niekada nedavė.

Mitas: API yra Nustatymų redaktorius

Manoma, kad kadangi iOS gali konfigūruoti IKEv1, IKEv2, L2TP ir IPsec profilius, programa gali bet kurį jų sukurti programiškai. Negali. Sistema suteikia kviečiančiai programai tiksliai vieną konfigūracijos vietą, ir ta vieta priima tik mažą viešų protokolų klasių rinkinį. Visa kita, ko žmonės tikisi, nuo L2TP iki atsisiųsto profilio, yra už šio paviršiaus arba Apple privatu.

Vėlesnės klaidos paprastai nėra programinės klaidos. Tai API atsisako darbo, kurio jai niekada nedavė, o sprendimas yra projektuoti ekraną pagal tai, ką API valdo.

Trys protokolo objektai ir tie, kurių nėra

Jūsų pasirinkimai yra IKEv1 per NEVPNProtocolIPSec, IKEv2 per NEVPNProtocolIKEv2 ir NETunnelProviderProtocol, jei pateikiate savo paketų tunelio plėtinį. NEVPNManager nuoroda išvardija priimamus protokolo objektus. L2TP ir PPTP niekada nepasitaiko tame sąraše, nes Apple neskelbė jiems klasių. Bandant bet kurį iš jų, įrašymo metu įvyksta klaida arba, dar blogiau, gaunama konfigūracija, kurios sistema tyliai atsisako naudoti.

Darbalaukio kodas laikosi kitų taisyklių. macOS sistemoje SCNetworkInterfaceCreateWithInterface sukrauna sąsajos tipą, pavyzdžiui, L2TP per IPv4, ir prijungia jį prie tinklo paslaugos, o networksetup -connectpppoeservice paleidžia rezultatą. Reikia administratoriaus teisių ir pagalbinės priemonės, nes bendra paslaptis ir slaptažodis patenka į sistemos raktinę. Nukopijuokite šį dizainą į iOS ir niekas nesikompiliuos.

Perduokite raktinės nuorodą, o ne slaptažodį

Nė viena IKE klasė nepriima slaptažodžio kaip teksto. Dvi savybės passwordReference ir sharedSecretReference nori nuolatinės raktinės nuorodos, kurią gaunate iš SecItemCopyMatching paprašę kSecReturnPersistentRef. Perdavus elemento duomenis arba įdėjus eilutę į lauką, įvyksta įrašymo klaida arba ryšys su tuščiais prisijungimo duomenimis. Nuoroda yra tokia patvari, kokia yra už jos esantis raktinės elementas, todėl elementas turi egzistuoti prieš surenkant konfigūraciją. Sukurkite jį toje pačioje transakcijoje kaip įrašymą ir pašalinsite visą eilės tvarkos klaidų klasę.

Sertifikato autentifikavimas eina kitu keliu: PKCS#12 blobui reikia identityData ir identityDataPassword. To blobo siuntimas programos pakete yra iš pavyzdinio kodo perimtas įprotis, o ne išleidimo sprendimas, nes slaptažodis keliauja kartu su juo ir kiekviena programos kopija turi tą pačią tapatybę.

Teisė ir prieinamumas sąlygoja viską

Valdytojo gali iš viso nebūti, o priežastis yra parūpinimas. Jūsų programos identifikatoriui reikia Network Extension galimybės kartu su asmeninio VPN teise, o profilis, kuris pasirašo build, turi turėti abi.

Praleiskite tai ir bendra instancija grąžina nil, arba įrašymas nepavyksta su klaida, kuri niekada nemini teisės. Prieinamumas yra kiti vartai. Jei nukreipiate į ką nors senesnį nei iOS 8, simbolio nėra vykdymo metu, todėl gedimas yra strigtis arba nil valdytojas, o ne valdytojas be konfigūracijos. Patikrinkite vykdymo aplinką ir teisę prieš derindami savo objektų grafą.

Įkelkite, pakeiskite, įrašykite, tada stebėkite užklausos tvarką

Traktuokite gyvavimo ciklą kaip įkėlimą, pakeitimą ir įrašymą ir niekada nepraleiskite įkėlimo. Kol loadFromPreferences nebaigtas, valdytojas nieko nelaiko ir protokolo objekto negalima skaityti ar keisti.

Antras įrašymas pakeičia konfigūraciją, o ne prideda dar vieną, todėl nebaigtas įrašymas gali sugadinti veikusį profilį. Užklausos taisyklės sudaro tvarkingą masyvą, ir ta tvarka yra politika. Padėkite prisijungimo iš bet kur taisyklę prieš atsijungimo taisyklę, ir po rankinio atsijungimo iškart įvyksta prisijungimas iš naujo, kas atrodo kaip defektas, bet atitinka dokumentuotą vertinimą.

Kai vartotojo veiksmas turi laimėti, perkelkite atsijungimo taisyklę į priekį. Tai, kas lieka už programos kontrolės, taip pat svarbu. Maršrutai ateina iš tunelio ar serverio politikos, o ne iš jūsų nustatytos nuostatos, o paketų tunelio teikėjas praneša apie juos paleisdamas. Programa negali išvardyti ar redaguoti profilių, kuriuos įdiegė kitos programos ar konfigūracijos profiliai, todėl nežadėkite ekrano, rodančio kiekvieną VPN įrenginyje.

Susiję straipsniai