iOS アプリの中に VPN 画面を作ると、最初の驚きは設定アプリのプロトコル一覧は API の一覧ではないことです。Network Extension フレームワークは、アプリが自分が所有する個人用 VPN 設定を一つだけ作ることを許可し、受け付けるプロトコルオブジェクトはわずかです。人が期待するその他すべて、L2TP からダウンロードしたプロファイルまで、その範囲の外にあるか Apple の非公開です。続く失敗はたいていバグではなく、API が渡されたことのない仕事を断っているのです。

神話:API は設定アプリのエディタ

iOS が IKEv1、IKEv2、L2TP、IPsec プロファイルを設定できるのだから、アプリもそれらをプログラムで作れるという信念があります。作れません。フレームワークが呼び出し側アプリに公開する設定スロットはちょうど一つで、そのスロットが受け付けるのは公開プロトコルクラスの小さな集合だけです。人が期待するその他すべて、L2TP からダウンロードしたプロファイルまで、その範囲の外にあるか Apple の非公開です。

続く失敗はたいていバグではありません。API が渡されたことのない仕事を断っているのであり、修正は API が所有するものに合わせて画面を設計することです。

三つのプロトコルオブジェクトと存在しないもの

選択肢は NEVPNProtocolIPSec による IKEv1、NEVPNProtocolIKEv2 による IKEv2、そして独自のパケットトンネル拡張を配布する場合の NETunnelProviderProtocol です。NEVPNManager のリファレンスは受け付けるプロトコルオブジェクトを列挙しています。L2TP と PPTP はその一覧に決して現れません、Apple がそれらのクラスを公開していないからです。どちらかを試すと保存時にエラーで終わるか、さらに悪ければ、システムが黙って使わない設定になります。

デスクトップのコードは別の規則に従います。macOS では SCNetworkInterfaceCreateWithInterface が IPv4 上の L2TP などのインターフェイスタイプを積み重ねてネットワークサービスに結び付け、networksetup -connectpppoeservice がその結果を起動します。共有シークレットとパスワードがシステムのキーチェーンに入るため、管理者権限とヘルパーツールが必要です。その設計を iOS にコピーしても何もコンパイルされません。

パスワードではなくキーチェーン参照を渡す

どちらの IKE クラスもパスワードをテキストとして受け取りません。二つのプロパティ passwordReference と sharedSecretReference は永続的なキーチェーン参照を要求し、それは kSecReturnPersistentRef を要求して SecItemCopyMatching から取得します。項目のデータを渡したり、文字列をフィールドに押し込んだりすると、保存の失敗や空の資格情報の接続になります。参照は背後のキーチェーン項目と同じだけしか持続しないので、設定を組み立てる前に項目が存在している必要があります。保存と同じトランザクションで作成すれば、順序に関するバグを丸ごと一クラス排除できます。

証明書認証は別の道をたどります:PKCS#12 ブロブには identityData と identityDataPassword を使います。そのブロブをアプリバンドルに入れて配布するのは、リリース判断ではなくサンプルコードから引き継いだ習慣です、パスワードが一緒に移動し、アプリのどのコピーも同じ ID を運ぶからです。

権利と可用性がすべての関門になる

マネージャがまったく存在しないことさえあり、その理由はプロビジョニングです。アプリ ID には Network Extension 機能と個人用 VPN の権利の両方が必要で、ビルドに署名するプロファイルも両方を備えている必要があります。

これを飛ばすと共有インスタンスは nil を返すか、権利に一切触れないエラーで保存が失敗します。可用性がもう一つの関門です。iOS 8 より古いものを対象にすると実行時にシンボルがなく、失敗はクラッシュか nil のマネージャになり、設定のないマネージャにはなりません。オブジェクトグラフをデバッグする前に実行環境と権利を確認してください。

読み込み、変更、保存、そしてオンデマンドの順序を見る

ライフサイクルは読み込み、変更、保存として扱い、読み込みを決して飛ばさないでください。loadFromPreferences が完了するまで、マネージャは何も保持せず、プロトコルオブジェクトは読み取りも差し替えもできません。

二回目の保存は別の設定を追加するのではなく設定を置き換えるので、中途半端な保存は動作していたプロファイルを壊すことがあります。オンデマンドの規則は順序付き配列をなし、その順序がポリシーです。どこからでも接続の規則を切断の規則より前に置くと、手動の切断の直後に再接続が起き、欠陥に見えますが文書化された評価に従っています。

ユーザーの操作を勝たせる必要があるときは切断の規則を先頭へ移してください。アプリの制御の外に残るものも同じくらい重要です。ルートはあなたが設定する選好ではなくトンネルやサーバーポリシーから来て、パケットトンネルプロバイダが起動時にそれらを報告します。アプリは他のアプリや構成プロファイルがインストールしたプロファイルを一覧表示も編集もできません、だから端末上のすべての VPN を表示する画面を約束してはいけません。

関連記事