NEVPNManager iOS'ta ne oluşturabilir (ve ne oluşturamaz)
iOS'un VPN API'si üç protokol sınıfından uygulamaya ait tek bir yapılandırma oluşturur. L2TP, PPTP ve imzalı profiller bu yüzeyin parçası değildir.
Bir iOS uygulamasının içinde VPN ekranı oluşturduğunuzda ilk sürpriz, Ayarlar uygulamasındaki protokol listesinin API listesi olmadığıdır. Network Extension çerçevesi uygulamanızın o uygulamaya ait tek bir kişisel VPN yapılandırması oluşturmasına izin verir ve yalnızca birkaç protokol nesnesini kabul eder. İnsanların beklediği her şey, L2TP'den indirilmiş bir profile kadar, bu yüzeyin dışındadır ya da Apple'ın özelidir. Ardından gelen hatalar genellikle hata değildir, API ona hiç verilmemiş bir işi reddediyordur.
Efsane: API bir Ayarlar düzenleyicisidir
iOS; IKEv1, IKEv2, L2TP ve IPsec profillerini yapılandırabildiği için bir uygulamanın bunlardan herhangi birini programatik olarak oluşturabileceğine inanılır. Oluşturamaz. Çerçeve, çağıran uygulamaya tam olarak bir yapılandırma yuvası sunar ve bu yuva yalnızca küçük bir genel protokol sınıfı kümesini kabul eder. İnsanların beklediği her şey, L2TP'den indirilmiş bir profile kadar, bu yüzeyin dışındadır ya da Apple'ın özelidir.
Ardından gelen hatalar genellikle hata değildir. API ona hiç verilmemiş bir işi reddediyordur ve çözüm, ekranı API'nin sahip olduğu şeylerin etrafında tasarlamaktır.
Üç protokol nesnesi ve var olmayanlar
Seçenekleriniz NEVPNProtocolIPSec üzerinden IKEv1, NEVPNProtocolIKEv2 üzerinden IKEv2 ve kendi paket tüneli uzantınızı gönderiyorsanız NETunnelProviderProtocol. NEVPNManager başvurusu kabul edilen protokol nesnelerini listeler. L2TP ve PPTP bu listede hiç görünmez çünkü Apple onlar için sınıf yayımlamadı. İkisinden birini denemek kaydetme sırasında hatayla sonuçlanır ya da daha kötüsü, sistemin sessizce kullanmayı reddettiği bir yapılandırmayla.
Masaüstü kodu farklı kurallara uyar. macOS'ta SCNetworkInterfaceCreateWithInterface IPv4 üzerinde L2TP gibi bir arayüz türünü yığar ve bir ağ hizmetine bağlar, networksetup -connectpppoeservice de sonucu başlatır. Yönetici hakları ve bir yardımcı araç gerekir, çünkü paylaşılan sır ve parola sistem anahtar zincirine girer. Bu tasarımı iOS'a kopyalayın, hiçbir şey derlenmez.
Parola değil, anahtar zinciri referansı geçirin
İki IKE sınıfından hiçbiri parolayı metin olarak kabul etmez. İki özellik passwordReference ve sharedSecretReference kalıcı bir anahtar zinciri referansı ister; bunu kSecReturnPersistentRef isteyerek SecItemCopyMatching üzerinden alırsınız. Öğe verilerini geçirmek veya alana bir dize sokmak, kaydetme hatası ya da boş kimlik bilgileriyle bir bağlantı üretir. Referans yalnızca arkasındaki anahtar zinciri öğesi kadar dayanıklıdır, bu yüzden öğe yapılandırma birleştirilmeden önce var olmalıdır. Aynı işlemde kaydetmeyle oluşturun, sıralama hatalarının bütün bir sınıfını ortadan kaldırırsınız.
Sertifika kimlik doğrulaması başka bir yol izler: PKCS#12 blobu için identityData artı identityDataPassword. Bu blobu uygulama paketinin içinde göndermek örnek koddan devralınan bir alışkanlıktır, sürüm kararı değil, çünkü parola onunla birlikte yolculuk eder ve uygulamanın her kopyası aynı kimliği taşır.
Yetki ve kullanılabilirlik her şeyi kapıdan geçirir
Yönetici hiç olmayabilir ve nedeni sağlamadır. Uygulama tanımlayıcınızın Network Extension yeteneğiyle birlikte kişisel VPN yetkisine ihtiyacı var ve derlemeyi imzalayan profilin ikisini de taşıması gerekir.
Bunu atlarsanız paylaşılan örnek nil döndürür ya da kaydetme, yetkiyi hiç anmayan bir hatayla başarısız olur. Kullanılabilirlik diğer kapıdır. iOS 8'den eski bir şeyi hedeflerseniz simge çalışma zamanında yoktur, bu yüzden başarısızlık bir çökme ya da nil yöneticidir, yapılandırmasız bir yönetici değil. Nesne grafiğinizi ayıklamadan önce çalışma zamanını ve yetkiyi kontrol edin.
Yükle, değiştir, kaydet, sonra isteğe bağlı sırayı izle
Yaşam döngüsünü yükleme, değiştirme ve kaydetme olarak ele alın ve yüklemeyi asla atlamayın. loadFromPreferences tamamlanana kadar yönetici hiçbir şey tutmaz ve protokol nesnesi okunamaz veya değiştirilemez.
İkinci bir kaydetme başka bir yapılandırma eklemek yerine onu değiştirir, bu yüzden yarım kalmış bir kaydetme çalışan bir profile zarar verebilir. İsteğe bağlı kurallar sıralı bir dizi oluşturur ve bu sıra politikadır. Her yerden bağlan kuralını bağlantı kesme kuralının önüne koyun, manuel bağlantı kesmeyi hemen yeniden bağlanma izler; bu bir kusur gibi görünür ama belgelenmiş değerlendirmeyi izler.
Kullanıcı eylemi kazanması gerektiğinde bağlantı kesme kuralını öne taşıyın. Uygulamanın denetimi dışında kalanlar da aynı derecede önemlidir. Rotalar sizin belirlediğiniz bir tercihten değil tünelden veya sunucu politikasından gelir ve paket tüneli sağlayıcısı başladığında bunları bildirir. Uygulama, diğer uygulamalar veya yapılandırma profilleri tarafından yüklenen profilleri listeleyemez veya düzenleyemez, bu yüzden cihazdaki her VPN'i gösteren bir ekran vaat etmeyin.