Стварыце экран VPN у праграме для iOS, і першая нечаканасць будзе ў тым, што спіс пратаколаў у праграме «Налады» — гэта не спіс API. Фрэймворк Network Extension дазваляе вашай праграме стварыць адну асабістую канфігурацыю VPN, якая належыць гэтай праграме, і ён прымае толькі некалькі аб’ектаў пратакола. Усё астатняе, чаго чакаюць людзі, ад L2TP да спампаванага профілю, знаходзіцца па-за гэтай паверхняй або належыць Apple. Збоі, якія ідуць далей, звычайна не памылкі: гэта API адмаўляецца ад задачы, якой яму ніколі не давалі.

Міф: API — гэта рэдактар налад

Перакананне ў тым, што паколькі iOS можа наладжваць профілі IKEv1, IKEv2, L2TP і IPsec, праграма можа стварыць любы з іх праграмна. Не можа. Фрэймворк дае праграме, якая выклікае, роўна адну камбінацыю канфігурацыі, і гэтая камбінацыя прымае невялікі набор публічных класаў пратакола. Усё астатняе, чаго чакаюць людзі, ад L2TP да спампаванага профілю, знаходзіцца па-за гэтай паверхняй або належыць Apple.

Збоі, якія ідуць далей, звычайна не памылкі. Гэта API адмаўляецца ад задачы, якой яму ніколі не давалі, і рашэнне — праектаваць экран вакол таго, чым валодае API.

Тры аб’екты пратакола і тыя, якіх не існуе

Вашы варыянты — IKEv1 праз NEVPNProtocolIPSec, IKEv2 праз NEVPNProtocolIKEv2 і NETunnelProviderProtocol, калі вы пастаўляеце ўласнае пашырэнне пакетнага тунеля. Даведнік NEVPNManager пералічвае прымальныя аб’екты пратакола. L2TP і PPTP ніколі не з’яўляюцца ў гэтым спісе, бо Apple не апублікавала для іх ніводнага класа. Спроба любога з іх сканчаецца падчас захавання памылкай або, што горш, канфігурацыяй, якую сістэма моўчкі адмаўляецца выкарыстоўваць.

Код для настольных сістэм падпарадкоўваецца іншым правілам. У macOS SCNetworkInterfaceCreateWithInterface складае тып інтэрфейса, напрыклад L2TP паверх IPv4, і далучае яго да сеткавай службы, а networksetup -connectpppoeservice запускае вынік. Патрабуюцца правы адміністратара і дапаможны сродак, бо агульны сакрэт і пароль трапляюць у сістэмныя звязкі ключоў. Перанясіце гэты дызайн у iOS — і нічога не скампілюецца.

Перадавайце спасылку на звязку ключоў, а не пароль

Ніводзін клас IKE не прымае пароль як тэкст. Дзве ўласцівасці passwordReference і sharedSecretReference патрабуюць пастаяннай спасылкі на звязку ключоў, якую вы атрымліваеце з SecItemCopyMatching, запытаўшы kSecReturnPersistentRef. Перадача даных элемента або прымусовае ўставіць радок у поле дае збой захавання або злучэнне з пустымі ўліковымі данымі. Спасылка трывалая толькі настолькі, наколькі трывалы элемент звязкі ключоў за ёй, таму элемент павінен існаваць да складання канфігурацыі. Стварыце яго ў той жа трансакцыі, што і захаванне, і вы прыбярэце цэлы клас памылак парадку.

Аўтэнтыфікацыя па сертыфікаце ідзе іншым шляхам: identityData плюс identityDataPassword для блоба PKCS#12. Пастаўка гэтага блоба ўнутры пакета праграмы — гэта звычка з прыкладнага кода, а не рашэнне для выпуску, бо пароль едзе разам з ім і кожная копія праграмы нясе тую ж асобу.

Права і даступнасць вызначаюць усё

Мэнэджар можа зусім не існаваць, і прычына — прадастаўленне. Ідэнтыфікатару вашай праграмы патрэбна магчымасць Network Extension разам з правам на асабісты VPN, і профіль, які падпісвае зборку, павінен несці абодва.

Прапусціце гэта — і агульны асобнік верне nil, або захаванне сарвецца з памылкай, якая ніколі не згадвае права. Даступнасць — другая брама. Нацэльцеся на што-небудзь старэйшае за iOS 8, і сімвал адсутнічае ў час выканання, таму збой — гэта падзенне або мэнэджар са значэннем nil, а не мэнэджар без канфігурацыі. Праверце асяроддзе выканання і права, перш чым адладжваць граф аб’ектаў.

Загрузіце, змяніце, захавайце, потым сачыце за парадкам па патрабаванні

Разглядайце жыццёвы цыкл як загрузку, змяненне, захаванне і ніколі не прапускайце загрузку. Пакуль loadFromPreferences не завершыцца, мэнэджар не трымае нічога, і аб’ект пратакола нельга прачытаць або замяніць.

Другое захаванне замяняе канфігурацыю, а не дадае яшчэ адну, таму незавершанае захаванне можа пашкодзіць профіль, які працаваў. Правілы па патрабаванні ўтвараюць упарадкаваны масіў, і гэты парадак і ёсць палітыка. Пастаўце правіла злучэння з любога месца перад правілам адключэння, і за ручным адключэннем адразу ідзе паўторнае злучэнне, што выглядае як дэфект, але адпавядае дакументаванай ацэнцы.

Перасуньце правіла адключэння наперад, калі дзеянне карыстальніка павінна перамагчы. Тое, што застаецца па-за кантролем праграмы, важна не менш. Маршруты прыходзяць з тунеля або з палітыкі сервера, а не з налады, якую вы ўсталёўваеце, прычым пастаўшчык пакетнага тунеля паведамляе іх пры запуску. Праграма не можа пералічыць або змяніць профілі, усталяваныя іншымі праграмамі ці профілямі канфігурацыі, таму не абяцайце экран, які паказвае кожны VPN на прыладзе.

Падобныя артыкулы