Apabila anda membina skrin VPN di dalam aplikasi iOS, kejutan pertama ialah senarai protokol aplikasi Tetapan bukan senarai API. Rangka kerja Network Extension membenarkan aplikasi anda mencipta satu konfigurasi VPN peribadi, milik aplikasi itu, dan ia hanya menerima beberapa objek protokol. Semua perkara lain yang orang jangkakan, daripada L2TP hingga profil yang dimuat turun, berada di luar permukaan itu atau peribadi kepada Apple. Kegagalan yang menyusul biasanya bukan pepijat, ia adalah API yang menolak kerja yang tidak pernah diberikan kepadanya.

Mitos: API ialah penyunting Tetapan

Dipercayai bahawa kerana iOS boleh mengkonfigurasi profil IKEv1, IKEv2, L2TP dan IPsec, aplikasi boleh mencipta mana-mana daripadanya secara pengaturcaraan. Ia tidak boleh. Rangka kerja ini mendedahkan tepat satu slot konfigurasi kepada aplikasi pemanggil, dan slot itu hanya menerima satu set kecil kelas protokol awam. Semua perkara lain yang orang jangkakan, daripada L2TP hingga profil yang dimuat turun, berada di luar permukaan itu atau peribadi kepada Apple.

Kegagalan yang menyusul biasanya bukan pepijat. Ia adalah API yang menolak kerja yang tidak pernah diberikan kepadanya, dan pembetulannya ialah mereka bentuk skrin mengikut apa yang dimiliki API.

Tiga objek protokol dan yang tidak wujud

Pilihan anda ialah IKEv1 melalui NEVPNProtocolIPSec, IKEv2 melalui NEVPNProtocolIKEv2, dan NETunnelProviderProtocol jika anda menghantar sambungan terowong paket anda sendiri. Rujukan NEVPNManager menyenaraikan objek protokol yang diterima. L2TP dan PPTP tidak pernah muncul dalam senarai itu kerana Apple tidak menerbitkan kelas untuknya. Mencuba mana-mana satu daripadanya berakhir semasa menyimpan dengan ralat, atau lebih teruk, dengan konfigurasi yang diam-diam enggan digunakan oleh sistem.

Kod desktop mengikut peraturan berbeza. Pada macOS, SCNetworkInterfaceCreateWithInterface menyusun jenis antara muka seperti L2TP melalui IPv4 dan melampirkannya pada perkhidmatan rangkaian, dan networksetup -connectpppoeservice memulakan hasilnya. Hak pentadbir dan alat pembantu diperlukan, kerana rahsia kongsi dan kata laluan masuk ke rantai kunci sistem. Salin reka bentuk itu ke iOS dan tiada apa yang dikompil.

Hantar rujukan rantai kunci, bukan kata laluan

Tiada kelas IKE menerima kata laluan sebagai teks. Dua sifat passwordReference dan sharedSecretReference mahukan rujukan rantai kunci yang berterusan, yang anda peroleh daripada SecItemCopyMatching dengan meminta kSecReturnPersistentRef. Menghantar data item, atau memasukkan rentetan ke dalam medan, menghasilkan kegagalan penyimpanan atau sambungan dengan kelayakan kosong. Rujukan itu hanya tahan selagi item rantai kunci di belakangnya, sebab itulah item itu mesti wujud sebelum konfigurasi dipasang. Ciptanya dalam transaksi yang sama dengan penyimpanan dan anda menghapuskan seluruh kelas pepijat pesanan.

Pengesahan sijil mengambil laluan berbeza: identityData tambah identityDataPassword untuk blob PKCS#12. Menghantar blob itu di dalam bundel aplikasi ialah tabiat yang diwarisi daripada kod contoh, bukan keputusan pelepasan, kerana kata laluan bergerak bersamanya dan setiap salinan aplikasi membawa identiti yang sama.

Hak dan ketersediaan mengawal segala-galanya

Pengurus mungkin tidak wujud sama sekali, dan puncanya ialah peruntukan. Pengecam aplikasi anda memerlukan keupayaan Network Extension bersama hak VPN peribadi, dan profil yang menandatangani binaan mesti membawa kedua-duanya.

Langkau perkara itu dan contoh kongsi mengembalikan nil, atau penyimpanan gagal dengan ralat yang tidak pernah menyebut hak. Ketersediaan ialah pintu lain. Sasarkan apa-apa yang lebih lama daripada iOS 8 dan simbol itu tiada semasa runtime, jadi kegagalannya ialah ranap atau pengurus nil, bukan pengurus tanpa konfigurasi. Semak runtime dan hak sebelum menyahpepijat graf objek anda.

Muat, ubah, simpan, kemudian perhatikan susunan atas permintaan

Anggap kitaran hayat sebagai muat, ubah, simpan, dan jangan sekali-kali langkau muatan. Sehingga loadFromPreferences selesai, pengurus tidak memegang apa-apa dan objek protokol tidak boleh dibaca atau ditukar.

Penyimpanan kedua menggantikan konfigurasi dan bukannya menambah satu lagi, jadi penyimpanan yang separuh siap boleh merosakkan profil yang berfungsi. Peraturan atas permintaan membentuk tatasusunan tersusun, dan susunan itu ialah dasar. Letakkan peraturan sambung-dari-mana-mana sebelum peraturan putus dan pemutusan manual diikuti sambungan semula segera, yang kelihatan seperti kecacatan tetapi mengikut penilaian yang didokumenkan.

Alihkan peraturan putus ke hadapan apabila tindakan pengguna mesti menang. Apa yang kekal di luar kawalan aplikasi sama pentingnya. Laluan datang daripada terowong atau dasar pelayan dan bukannya keutamaan yang anda tetapkan, dengan penyedia terowong paket melaporkannya apabila ia bermula. Aplikasi tidak boleh menyenaraikan atau menyunting profil yang dipasang oleh aplikasi lain atau profil konfigurasi, jadi jangan janjikan skrin yang menunjukkan setiap VPN pada peranti.

Artikel berkaitan