Две много различни задачи попадат под названието програмно VPN и само една от тях е достъпна за обикновено приложение на която и да е от двете мобилни платформи. Първата е включване на профил, който потребителят вече е запазил; втората е изграждане на тунел вътре в собствения ви процес. Android ви дава втората чрез VpnService, а iOS ви дава втората чрез правото Network Extension, докато първата остава при системата, собственика на устройството или MDM сървър. Да разберете коя всъщност ви трябва обикновено прави проекта по-малък.

Две задачи с едно име

Активирането на запазен профил означава да кажете на съществуващ тунел да се вдигне: хост, удостоверение, протокол, всичко вече конфигурирано някъде, където потребителят може да го види. Изграждането на тунел означава, че вашият код притежава интерфейса, цикъла на пакетите и протокола. Изглеждат подобни в продуктовия беклог и почти не споделят реализация.

Нито една мобилна платформа не излага първата на SDK приложение. Връзка, която се появява без потребителят да прави нищо, е неразличима от зловреден софтуер, затова и двете системи поставят портал за съгласие пред всяко приложение, което пренася трафик.

Android: портал за съгласие и никакъв API за профили

VpnService съществува от Android 4.0 и позволява на приложението да създаде tun интерфейс, след което да чете и записва пакети. Услугата трябва да бъде декларирана с BIND_VPN_SERVICE, а VpnService.prepare() създава системния диалог, който иска от потребителя разрешение. Примерът на платформата ToyVpn е най-ясното изявление на предвидената форма: вашият код притежава интерфейса и всичко, което минава през него.

Това, което не прави, е да добавя запис на екрана за VPN настройки на системата. Няма публичен API за това и приложението Настройки пази профилите си в хранилище, до което обикновено приложение не може да стигне. Извикванията на скритите класове от нормално приложение създават профили, които системата никога не изброява, затова код, който изглеждаше работещ в една сборка, тихо спира да работи в следващата.

Управляваният път е отделен. Собственик на устройство или на профил може да определи пакет за постоянно включен VPN чрез API на устройствената политика, а корпоративен инструмент може да изпрати профил, който потребителят после одобрява. Това е правомощие за управление на устройство, а не разрешение, което приложение иска при инсталиране. Ако клиентът ви е организация, това е пътят, за който да планирате; ако клиентът ви е човек, който инсталира от магазин, това изобщо не е налично.

iOS: правото е границата

iOS разделя същата работа по друг начин. VPN клиент реализира доставчик на пакетен тунел или прокси на приложение в рамките на Network Extension и съответното право трябва да бъде предоставено на акаунта за разработчици. Лична VPN конфигурация чрез NEVPNManager съществува за по-простия случай и тя все още работи в същия модел на разрешения. Apple документира цялата повърхност в справочника за Network Extension, който си струва да се прочете, преди да определите обхвата на работата.

Няма поддържан начин да отворите екрана за VPN настройки, да прочетете запазените конфигурации на потребителя или да стартирате една от тях. Клиентът може да изпрати конфигурационен профил, който потребителят да инсталира, и след това да използва получения тунел чрез обикновени мрежови извиквания. Тунелирането за отделни приложения се задава от MDM сървър чрез правило при поискване, а не се избира от приложението по време на работа.

VPN клиент от голям доставчик не е доказателство, че вашият акаунт може да изпрати същото. Тези права се заявяват за всеки акаунт за разработчици и се преглеждат, така че рискът за графика лежи при Apple, а не при вашия план за спринта.

Настолният компютър стига по-далеч, но собствеността е същата

Windows е разрешителният случай. Add-VpnConnection създава запис в телефонния указател от сесия на PowerShell с повишени права, а rasdial го свързва или прекъсва от скрипт. Приложението може също да управлява клиент на доставчик чрез документирания му команден ред. Създаването на профила все още е административно действие, защото записът живее в хранилище за цялата машина.

macOS се държи по същия начин с други инструменти. scutil --nc start и stop работят върху услуги, които вече съществуват, докато създаването на такава е задача по системна администрация. Собствеността върху процеса на лаптоп не ви прави собственик на конфигурацията.

Какво да изградите вместо това

Ако истинското изискване е приложението ви да достига вътрешен API, тунелът, който потребителят вече използва, е достатъчен. Правете обикновени HTTPS заявки, оставете системата да избере пътя и спрете да се опитвате да управлявате тунела. Ако изискването е само трафикът на вашето приложение да използва тунела, поискайте VPN за отделни приложения чрез канала за управление или прекратете TLS вътре в приложението към услуга, достъпна без него.

Скритите API не са прекият път, който си струва. Те се променят между изданията, провалят прегледа на приложенията и отказите, които създават, изглеждат за този, който наследява кода, като обикновени мрежови откази. Сравнението не е Android срещу iOS; то е притежаване на тунел срещу молба платформата да насочва трафик и само първото е ваше за изграждане.

Подобни статии