Construeixi una pantalla de VPN dins d’una aplicació d’iOS i la primera sorpresa és que la llista de protocols de l’aplicació Configuració no és la llista de l’API. El marc Network Extension permet que la seva aplicació creï una configuració de VPN personal, propietat d’aquesta aplicació, i només accepta uns quants objectes de protocol. Tota la resta que la gent espera, des de L2TP fins a un perfil baixat, queda fora d’aquesta superfície o és privada d’Apple. Les fallades que segueixen normalment no són errors: és l’API que rebutja una feina que mai no li van donar.

El mite: l’API no és un editor de Configuració

La creença és que, com que iOS pot configurar perfils IKEv1, IKEv2, L2TP i IPsec, una aplicació pot crear-ne qualsevol per programari. No pot. El marc exposa exactament una ranura de configuració a l’aplicació que la crida, i aquesta ranura només accepta un conjunt reduït de classes de protocol públiques. Tota la resta que la gent espera, des de L2TP fins a un perfil baixat, queda fora d’aquesta superfície o és privada d’Apple.

Les fallades que segueixen normalment no són errors. Són l’API que rebutja una feina que mai no li van donar, i la solució és dissenyar la pantalla al voltant del que l’API posseeix.

Tres objectes de protocol i els que no existeixen

Les seves opcions són IKEv1 mitjançant NEVPNProtocolIPSec, IKEv2 mitjançant NEVPNProtocolIKEv2 i NETunnelProviderProtocol si distribueix una extensió de túnel de paquets pròpia. La referència de NEVPNManager enumera els objectes de protocol acceptats. L2TP i PPTP no apareixen mai en aquesta llista perquè Apple no va publicar cap classe per a ells. Intentar qualsevol dels dos acaba en desar amb un error o, pitjor, amb una configuració que el sistema declina utilitzar en silenci.

El codi d’escriptori segueix regles diferents. A macOS, SCNetworkInterfaceCreateWithInterface apila un tipus d’interfície com L2TP sobre IPv4 i l’adjunta a un servei de xarxa, i networksetup -connectpppoeservice inicia el resultat. Calen drets d’administrador i una eina auxiliar, perquè el secret compartit i la contrasenya van al clauer del sistema. Copiï aquest disseny a iOS i no compilarà res.

Passi una referència del clauer, no la contrasenya

Cap de les dues classes IKE no accepta una contrasenya com a text. Les dues propietats passwordReference i sharedSecretReference volen una referència persistent del clauer, que obteniu de SecItemCopyMatching demanant kSecReturnPersistentRef. Passar les dades de l’element o forçar una cadena al camp produeix una fallada en desar o una connexió amb credencials buides. La referència només és tan duradora com l’element del clauer que hi ha darrere, i per això l’element ha d’existir abans que es munti la configuració. Creeu-lo en la mateixa transacció que el desat i elimina tota una classe d’errors d’ordre.

L’autenticació amb certificat pren una altra ruta: identityData més identityDataPassword per a un blob PKCS#12. Distribuir aquest blob dins del paquet de l’aplicació és un costum heretat del codi d’exemple i no una decisió de lliurament, perquè la contrasenya viatja amb ell i cada còpia de l’aplicació porta la mateixa identitat.

El dret i la disponibilitat ho condicionen tot

Pot ser que el gestor no existeixi gens, i la raó és el proveïment. L’identificador de la seva aplicació necessita la capacitat Network Extension juntament amb el dret de VPN personal, i el perfil que signa la compilació ha de portar tots dos.

Ometi-ho i la instància compartida retorna nil, o el desat falla amb un error que mai no esmenta el dret. La disponibilitat és l’altra porta. Apunti a qualsevol cosa anterior a iOS 8 i el símbol falta en temps d’execució, així que la fallada és un accident o un gestor amb valor nil, no un gestor sense configuració. Comprovi l’entorn d’execució i el dret abans de depurar el graf d’objectes.

Carregui, modifiqui, desi, i després vigili l’ordre sota demanda

Tracti el cicle de vida com a càrrega, modificació i desat, i no ometi mai la càrrega. Fins que loadFromPreferences no es completi, el gestor no té res i l’objecte de protocol no es pot llegir ni intercanviar.

Un segon desat substitueix la configuració en lloc d’afegir-ne una altra, així que un desat a mitges pot malmetre un perfil que funcionava. Les regles sota demanda formen una matriu ordenada, i aquest ordre és la política. Posi una regla de connexió des de qualsevol lloc davant de la regla de desconnexió i una desconnexió manual va seguida d’una reconnexió immediata, cosa que sembla un defecte però segueix l’avaluació documentada.

Mogui la regla de desconnexió al davant quan l’acció de l’usuari ha de guanyar. El que queda fora del control de l’aplicació importa igual. Les rutes vénen del túnel o de la política del servidor, no d’una preferència que vostè estableixi, i el proveïdor de túnel de paquets les informa quan arrenca. L’aplicació no pot llistar ni editar perfils instal·lats per altres aplicacions o perfils de configuració, així que no prometi una pantalla que mostri cada VPN del dispositiu.

Articles relacionats