###実現したいこと
現在「Per-App VPN」 のテストアプリをdeveloperサイトの情報Testing Per-App VPN
を参考にアプリごとのVPN接続テストをしたいのですが、接続に失敗する状態で
何が間違っているかわかりません。
わかる方がいればご教授お願いできませんでしょうか?
実施内容の詳細は以下の通りです。
##実施内容
・プロビジョニングプロファイルのアプリIDにNetworkExtensionを追加
・XCodeのTargetsのCapabilitiesにNetworkextensionを有効化
以下のチェックボックスについても全て有効とした。 ・App Proxy ・Content Filter ・Packet Tunnel ・DNS Proxy ※対応するentitlementファイルがプロジェクト内に含まれていることを確認済み
・Info.plistに以下の内容を追加
<key>NETestAppMapping</key <dict> <key>3D7A07D8-97D0-4E5A-BB04-1EB82DD12A35</key> <array> <string>my.greatenterprise.SuperApp</string> </array> <dict>
・テスト用のプロファイルを作成し端末へインストール(AppleConfigrator2でインストール)
→プロファイルの詳細は以下のプロファイルの内容を参照願います。
・テスト用のVPN接続のソースコードの作成
→詳細は以下のソースコードの内容を参照願います。
本ソースコードを実行したところ以下のエラーメッセージが表示されてしまう。
VPN接続失敗:The operation couldn’t be completed. (NEVPNErrorDomain error 1.)
Per-App VPNを実施するために使用した環境と、プロファイルの内容、ソースコードについては以下の通りです。
###開発環境
Xcode 10.1
VPNサーバタイプ:L2TP
iOS12.1.4(iPhone8)
開発言語 swift 4.2.1
###プロファイルの内容
<!-- 本プロファイルはApple Configulator2で作成したものを改変する手順で作成している。 --> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PayloadContent</key> <array> <dict> <key>PayloadUUID</key> <string>C3179238-32FE-406E-A3E1-30700BF42977</string> <!-- Configuration Profile Reference.pdfによると PayloadTypeには「com.apple.vpn.managed.applayer」を指定することで、 アプリごとのVPNペイロードとなる記載がある。 --> <key>PayloadType</key> <string>com.apple.vpn.managed.applayer</string> <!-- 逆DNSスタイルの識別子 このプロファイルは新しいプロファイルを既存のプロファイルと 置き換えるかどうかを決定するのに使用する。 --> <key>PayloadIdentifier</key> <string>com.apple.vpn.managed.applayer.C3179238-32FE-406E-A3E1-30700BF42977</string> <!-- ☆ VPNTypeをVPNにした場合はVPNSubTypeキーが必要 VPNSubTypeにはアプリのBundleIDを入力する。 --> <key>VPNSubType</key> <string>xx.xx.xxx.appBundleID</string> <!-- このタイプのペイロードで使用可能な設定を決定する。 --> <key>VPNType</key> <string>VPN</string> <!-- ☆ デバイスに表示されるVPN接続の説明 --> <key>UserDefinedName</key> <string>VPN_CONFIG</string> <key>PayloadDescription</key> <string>VPN 設定を構成します</string> <key>PayloadDisplayName</key> <string>VPN</string> <key>PayloadVersion</key> <integer>1</integer> <!-- VPNUUIDはユーザーが固有で決める識別子でよい →DeveloperサイトのNETestAppMappingのkey値に合わせた値を指定。 --> <key>VPNUUID</key> <string>3D7A07D8-97D0-4E5A-BB04-1EB82DD12A35</string> <key>IPv4</key> <dict> <key>OverridePrimary</key> <integer>0</integer> </dict> <key>Proxies</key> <dict> <key>HTTPEnable</key> <integer>0</integer> <key>HTTPSEnable</key> <integer>0</integer> </dict> <key>VPN</key> <dict> <!-- AuthNameにはVPNサーバで設定したアカウントを入力 --> <key>AuthName</key> <string>xxxx</string> <!-- AuthPasswordにはVPNサーバで設定したパスワードを入力 --> <key>AuthPassword</key> <string>yyyy</string> <!-- AuthenticationMethodはAppleConfiglator2で作成したDefault値のまま変更なしとする --> <key>AuthenticationMethod</key> <string>Password</string> <!-- ProviderBundleIdentifierは入力内容が不明(zzzzとしておく) --> <key>ProviderBundleIdentifier</key> <string>zzzz</string> <!-- RemoteAddressはVPNサーバのアドレスを入力 --> <key>RemoteAddress</key> <string>abc.co.jp</string> </dict> </dict> </array> <key>PayloadDisplayName</key> <string>名称未設定</string> <key>PayloadIdentifier</key> <string>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</string> <key>PayloadRemovalDisallowed</key> <false/> <key>PayloadType</key> <string>Configuration</string> <key>PayloadUUID</key> <string>88D93328-F0AE-4AC6-9AE5-FFA6A4B5BCBF</string> <key>PayloadVersion</key> <integer>1</integer> </dict> </plist>
###ソースコードの内容
以下のソースコードには
import NetworkExtensionを記載済みです。
swift
1 func connectvpn(){ 2 let serverAddress = "abc.co.jp"//VPNサーバのアドレスを指定 3 let username = "xxxx"//VPNサーバのアカウントを指定 4 let tpm = NETunnelProviderManager() 5 tpm.loadFromPreferences { error in 6 if (error != nil) { 7 print("VPN設定読み込み不可") 8 return 9 } 10 let tpp = NETunnelProviderProtocol() 11 //トンネリングプロトコル認証資格情報のユーザー名コンポーネント。 12 tpp.username = username 13 //トンネリングサーバのアドレス 14 tpp.serverAddress = serverAddress 15 //デバイスがスリープしているときにVPNを切断するかどうかを示すフラグ。 16 tpp.disconnectOnSleep = false 17 //VPNトンネリングプロトコルの構成設定を含むNEVPNProtocolオブジェクト。 18 tpm.protocolConfiguration = tpp 19 //VPN設定の表示名を含む文字列。 20 tpm.localizedDescription = "VPN_CONFIG" 21 //VPN設定の有効状態を切り替えるために使用されるブール値。 22 tpm.isEnabled = true 23 //Network Extensionの設定でVPN設定を保存します。 24 tpm.saveToPreferences(completionHandler: { err in 25 if(err != nil){ 26 print("VPN設定の保存失敗") 27 return 28 } 29 else{ 30 do{ 31 try tpm.connection.startVPNTunnel() 32 } 33 catch{ 34 /* 35 ここで以下のエラーが表示されてしまう。 36 VPN接続失敗:The operation couldn’t be completed. (NEVPNErrorDomain error 1.) 37 */ 38 print("VPN接続失敗:(error.localizedDescription)") 39 } 40 } 41 }) 42 } 43 }
###補足情報
- VPNサーバについてはL2TPで起動済みで、iOSのVPNから接続可能であることは確認済み。
- 本プロファイルを端末にインストールすると、OSのVPN設定内にAPP別VPN欄が未接続で作成されることを確認済み。
- 本ソースコードを実行すると、OSのVPN設定内にVPN_CONFIGセルが追加され、[アプリ名 - アップデートが必要です。]が表示されることを確認済み。
###疑問点
VPNのサーバのタイプは「Personal VPN」の場合はL2TPは非対応という情報があるが、「Per-App VPN」はタイプに依存しない(L2TPで接続可能)かが不明。
あなたの回答
tips
プレビュー