Mida NEVPNManager iOS-is luua suudab (ja mida mitte)
iOS-i VPN-i API koostab kolmest protokolliklassist ühe rakendusele kuuluva konfiguratsiooni. L2TP, PPTP ja allkirjastatud profiilid ei kuulu selle pinnaga.
Kui ehitada iOS-i rakendusse VPN-i ekraan, on esimene üllatus see, et Sätete rakenduse protokolliloend ei ole API loend. Network Extensioni raamistik lubab rakendusel luua ühe isikliku VPN-i konfiguratsiooni, mis kuulub sellele rakendusele, ja see võtab vastu ainult mõned protokolliobjektid. Kõik muu, mida inimesed ootavad, alates L2TP-st kuni alla laaditud profiilini, asub sellest pinnast väljas või on Apple'i privaatne. Järgnevad tõrked ei ole tavaliselt vead, need on API keeldumine tööst, mida talle kunagi ei antud.
Müüt: API on Sätete redaktor
Arvatakse, et kuna iOS suudab konfigureerida IKEv1, IKEv2, L2TP ja IPsec profiile, saab rakendus neist igaüht programmiliselt luua. Ei saa. Raamistik pakub kutsuvale rakendusele täpselt ühe konfiguratsioonipesa ja see pesa võtab vastu väikese hulga avalikke protokolliklasse. Kõik muu, mida inimesed ootavad, alates L2TP-st kuni alla laaditud profiilini, asub sellest pinnast väljas või on Apple'i privaatne.
Järgnevad tõrked ei ole tavaliselt vead. Need on API keeldumine tööst, mida talle kunagi ei antud, ja parandus on kujundada ekraan selle järgi, mida API omab.
Kolm protokolliobjekti ja need, mida ei ole olemas
Valikud on IKEv1 NEVPNProtocolIPSec kaudu, IKEv2 NEVPNProtocolIKEv2 kaudu ja NETunnelProviderProtocol, kui tarnite oma paketitunnelilaiendit. NEVPNManageri viide loetleb vastuvõetavad protokolliobjektid. L2TP ja PPTP ei esine selles loendis kunagi, sest Apple ei avaldanud nende jaoks ühtegi klassi. Kummagi proovimine lõpeb salvestamisel veaga või veel hullemini konfiguratsiooniga, mida süsteem vaikselt ei kasuta.
Töölaua kood järgib teisi reegleid. macOS-is virnastab SCNetworkInterfaceCreateWithInterface liidesetüübi, näiteks L2TP üle IPv4, ja kinnitab selle võrguteenusele ning networksetup -connectpppoeservice käivitab tulemuse. Vaja on administraatoriõigusi ja abivahendit, sest jagatud saladus ja parool lähevad süsteemi võtmehoidlasse. Kopeerige see disain iOS-i ja miski ei kompileeru.
Edastage võtmehoidla viide, mitte parool
Kumbki IKE klass ei võta parooli tekstina vastu. Kaks atribuuti passwordReference ja sharedSecretReference soovivad püsivat võtmehoidla viidet, mille saate funktsioonist SecItemCopyMatching, küsides kSecReturnPersistentRef. Üksuse andmete edastamine või stringi väljale paigutamine tekitab salvestamise tõrke või ühenduse tühjade mandaatidega. Viide on sama vastupidav kui selle taga olev võtmehoidla üksus, mistõttu peab üksus eksisteerima enne konfiguratsiooni koostamist. Looge see samas tehingus salvestamisega ja kõrvaldate terve klassi järjestusvigu.
Sertifikaadi autentimine käib teist teed: identityData pluss identityDataPassword PKCS#12 bloogi jaoks. Selle bloogi rakendusepaketti panemine on näidiskoodist üle võetud harjumus, mitte tarneotsus, sest parool reisib sellega kaasas ja iga rakenduse koopia kannab sama identiteeti.
Õigused ja kättesaadavus määravad kõik
Haldur ei pruugi üldse olemas olla ja põhjus on provisjonimine. Teie rakenduse identifikaator vajab Network Extensioni võimekust koos isikliku VPN-i õigusega ning buildi allkirjastaval profiilil peavad olema mõlemad.
Kui selle vahele jätate, tagastab jagatud eksemplar nil või salvestamine ebaõnnestub veaga, mis ei maini kunagi õigust. Kättesaadavus on teine värav. Kui sihite midagi vanemat kui iOS 8, puudub sümbol käitusajal, nii et tõrge on krahh või nil-haldur, mitte haldur ilma konfiguratsioonita. Kontrollige käitusaega ja õigust enne oma objektigraafi silumist.
Laadi, muuda, salvesta ja jälgi seejärel nõudmisel järjekorda
Käsitlege elutsüklit kui laadimine, muutmine, salvestamine ja ärge kunagi jätke laadimist vahele. Kuni loadFromPreferences ei ole lõppenud, ei hoia haldur midagi ning protokolliobjekti ei saa lugeda ega vahetada.
Teine salvestus asendab konfiguratsiooni, selle asemel et lisada veel üks, nii et pooleli jäänud salvestus võib kahjustada profiili, mis töötas. Nõudmisel reeglid moodustavad järjestatud massiivi ja see järjekord on poliitika. Pange kõikjal-ühendamise reegel lahtiühendamise reegli ette ja käsitsi lahtiühendamisele järgneb kohene uuesti ühendamine, mis näib defektina, kuid järgib dokumenteeritud hindamist.
Liigutage lahtiühendamise reegel ette, kui kasutaja tegevus peab võitma. See, mis jääb rakenduse kontrolli alt välja, loeb sama palju. Marsruudid tulevad tunnelist või serveri poliitikast, mitte teie seatud eelistusest, kusjuures paketitunneliteenuse pakkuja teatab neist käivitumisel. Rakendus ei saa loetleda ega muuta teiste rakenduste või konfiguratsiooniprofiilide paigaldatud profiile, seega ärge lubage ekraani, mis näitab seadmes iga VPN-i.