İki çok farklı iş, programatik VPN adı altında toplanır ve bunlardan yalnızca biri iki mobil platformdan herhangi birinde sıradan bir uygulama için kullanılabilir. Birincisi kullanıcının önceden kaydettiği profili açmaktır; ikincisi kendi süreciniz içinde bir tünel inşa etmektir. Android ikincisini VpnService aracılığıyla verir, iOS ikincisini Network Extension hakkı aracılığıyla verir, birincisi ise sistemde, cihaz sahibinde veya bir MDM sunucusunda kalır. Gerçekte hangisine ihtiyacınız olduğunu bulmak genellikle projeyi küçültür.

Aynı adı paylaşan iki iş

Kayıtlı bir profili etkinleştirmek, var olan bir tünele yukarı çıkmasını söylemek demektir: bir ana makine, bir kimlik bilgisi, bir protokol, hepsi zaten kullanıcının görebileceği bir yerde yapılandırılmış. Tünel inşa etmek, kodunuzun arayüzün, paket döngüsünün ve protokolün sahibi olması demektir. Bir ürün biriktirme listesinde benzer görünürler ve neredeyse hiç uygulama paylaşmazlar.

Hiçbir mobil platform birincisini bir SDK uygulamasına açmaz. Kullanıcı hiçbir şey yapmadan ortaya çıkan bir bağlantı kötü amaçlı yazılımdan ayırt edilemez, bu yüzden her iki sistem de trafik taşıyan her uygulamanın önüne bir onay kapısı koyar.

Android: bir onay kapısı ve profil API'si yok

VpnService Android 4.0'dan beri var ve bir uygulamanın tun arayüzü oluşturmasına, ardından paketleri okuyup yazmasına izin verir. Hizmet BIND_VPN_SERVICE ile bildirilmelidir ve VpnService.prepare() kullanıcıdan izin isteyen sistem iletişim kutusunu üretir. Platform örneği ToyVpn, amaçlanan biçimin en açık ifadesidir: kodunuz arayüzün ve içinden geçen her şeyin sahibidir.

Yapmadığı şey, sistemin VPN ayarları ekranına bir giriş eklemektir. Bunun için genel bir API yoktur ve Ayarlar uygulaması profillerini sıradan bir uygulamanın ulaşamayacağı bir depoda tutar. Saklı sınıflara normal bir uygulamadan yapılan çağrılar, sistemin hiç listelemediği profiller üretir; bu yüzden bir derlemede çalışıyor gibi görünen kod, sonrakinde sessizce çalışmayı bırakır.

Yönetilen yol ayrıdır. Bir cihaz veya profil sahibi, cihaz ilkesi API'leri aracılığıyla her zaman açık bir VPN paketi belirleyebilir ve bir kurumsal araç, kullanıcının sonradan onayladığı bir profili gönderebilir. Bu bir cihaz yönetimi yetkisidir, uygulamanın kurulum sırasında istediği bir izin değildir. Müşteriniz bir kuruluşsa planlamanız gereken yol budur; müşteriniz mağazadan kuran bir kişiyse bu hiç mevcut değildir.

iOS: hak sınırdır

iOS aynı işi farklı böler. Bir VPN istemcisi Network Extension çerçevesi altında bir paket tüneli sağlayıcısı veya bir uygulama vekili uygular ve eşleşen hak geliştirici hesabına verilmelidir. Kişisel bir VPN yapılandırması NEVPNManager aracılığıyla daha basit durum için vardır ve hâlâ aynı izin modelinde çalışır. Apple tüm yüzeyi Network Extension başvurusunda belgeler; işin kapsamını belirlemeden önce okumaya değer.

VPN ayarları ekranını açmanın, kullanıcının kayıtlı yapılandırmalarını okumanın veya bunlardan birini başlatmanın desteklenen bir yolu yoktur. Bir istemcinin yapabileceği, kullanıcının kuracağı bir yapılandırma profili göndermek ve ardından ortaya çıkan tüneli sıradan ağ çağrılarıyla kullanmaktır. Uygulama başına tünel, bir MDM sunucusu tarafından isteğe bağlı kural ile atanır, uygulama tarafından çalışma anında seçilmez.

Büyük bir sağlayıcıdan alınan VPN istemcisi, hesabınızın aynı şeyi gönderebileceğinin kanıtı değildir. Bu haklar geliştirici hesabı başına istenir ve incelenir, bu yüzden takvim riski Apple'da, sizin sprint planınızda değildir.

Masaüstü daha ileri gider ama sahiplik değişmez

Windows izin veren durumdur. Add-VpnConnection yükseltilmiş bir PowerShell oturumundan telefon defteri girişi oluşturur ve rasdial bunu bir betikten bağlar veya ayırır. Bir uygulama ayrıca sağlayıcı istemcisini belgelenmiş komut satırı aracılığıyla sürebilir. Profili oluşturmak hâlâ yönetici işlemidir, çünkü giriş makine genelindeki bir depoda yaşar.

macOS diğer araçlarla aynı şekilde davranır. scutil --nc start ve stop zaten var olan hizmetler üzerinde çalışır, birini oluşturmak ise bir sistem yönetimi görevidir. Dizüstü bilgisayarda sürecin sahibi olmak sizi yapılandırmanın sahibi yapmaz.

Yerine ne inşa etmeli

Gerçek gereksinim uygulamanızın bir iç API'ye ulaşmasıysa, kullanıcının zaten çalıştırdığı tünel yeterlidir. Normal HTTPS istekleri gönderin, yolu sistem seçsin ve tüneli kontrol etmeye çalışmayı bırakın. Gereksinim yalnızca uygulamanızın trafiğinin tüneli kullanmasıysa, yönetim kanalı aracılığıyla uygulama başına VPN isteyin veya TLS'i uygulama içinde onsuz erişilebilen bir hizmete karşı sonlandırın.

Gizli API'ler almaya değer kısa yollar değildir. Sürümler arasında değişirler, uygulama incelemesinde başarısız olurlar ve ürettikleri arızalar kodu devralan kişiye sıradan ağ arızaları gibi görünür. Karşılaştırma Android'e karşı iOS değildir; bu, bir tünele sahip olmak ile platformdan trafiği yönlendirmesini istemek arasındadır ve yalnızca birincisi sizin inşa etmeniz gereken şeydir.

İlgili makaleler