質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VPN

VPN(Virtual Private Network)は、仮想プライベートネットワークとも呼ばれ、インターネットに接続してるユーザー間に仮想的な通信トンネルを構築した組織内ネットワークです。認証や暗号化を用いて通信経路を保護し安全なネットワークの構築ができます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1206閲覧

[iOS swift]Testing Per-App VPNの接続テストができない

sakamotoyuya

総合スコア10

VPN

VPN(Virtual Private Network)は、仮想プライベートネットワークとも呼ばれ、インターネットに接続してるユーザー間に仮想的な通信トンネルを構築した組織内ネットワークです。認証や暗号化を用いて通信経路を保護し安全なネットワークの構築ができます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/06/06 05:28

編集2019/06/06 05:38

###実現したいこと
現在「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で接続可能)かが不明。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問