NetworkExtension之NEVPNManager开发笔记

此篇文章不会详述iOS中VPN开发的各种流程,只是博主自己在做 Personal VPN 开发时的遇到的一些坑,如果需要详细流程可自行查询官方文档。

Apple提供了 NetworkExtension 框架,让开发者可以在iOS、Mac os中进行VPN开发。iOS中的VPN开发分为 个人VPN 和 非个人VPN 开发。个人VPN开发比较简单,可以直接使用系统提供的IPSec、IKEv2协议来进行VPN连接。而在iOS9之后,Apple开放了新的api,可以让开发者开发自己的私密协议的VPN,参考地址: https://developer.apple.com/reference/networkextension

开发前提

虽然此篇文章不讲解流程,但开发VPN的前提还是值得一说的。开发VPN必须得有 开发者账号 ,并且在对应 App IDs 配置项中需要勾选下图所示选项,再创建对应的 Provisioning Profiles 文件。

注意VPN开发只能在真机进行测试。

NetworkExtension之NEVPNManager开发笔记

开发流程

Personal VPN 通过 NEVPNManager 类来进行开发,NEVPNManager 用于创建和管理VPN配置并控制最终的VPN隧道连接。参考地址:https://developer.apple.com/reference/networkextension/nevpnmanager

获取VPN管理者单利对象

创建并配置IPSec协议

VPN常用配置信息

保存VPN配置信息到系统偏好设置

从系统偏好设置加载VPN配置信息

从系统偏好设置移除VPN配置信息

启动VPN

断开VPN

监听VPN系统配置信息和VPN连接状态改变

完整代码

JFVPNManager.swift

JFKeychain.m

JFHomeViewController.swift

VPN调用

VPN状态改变回调

注意事项:

1.第一次保存配置会给系统安装一个配置文件,并且用户需要手动授权。

2.每次启动VPN都需要去加载系统的配置信息。

3.IPSec协议里的密码和预共享密钥都需要是一个Keychain中密码的永久引用,即 kSecReturnPersistentRef,一定不要直接赋值。(证书密码不需要)

4.如果用证书来作为 IKE 的认证方式,而且 Server 端用的是自签发证书,则需要手工将 CA 导入到 iOS 设备。目前 Apple 还没提供添加授信证书的方法。

5.ENVPNManager 和系统配置文件中的信息不同步,可以监听 NEVPNConfigurationChange 通知。

6.connection 的 status 不支持 kvo,所以需要监听 NEVPNStatusDidChange 通知随时获取VPN连接状态改变。

常见错误:

1.与 VPN 服务器协议失败。(IPSec)

可能是psk密钥错误,也可能是 localIdentifier 和 remoteIdentifier 设置错误。

2.VPN 服务器并未响应。(IPSec)

可能是服务器地址填写错误,也可能是服务器的问题。

3.未提供任何 VPN 共享密钥。(IPSec)

共享密钥认证属性设置错误,也可能是没有使用 Keychain 永久引用。

4.连接没有任何反应。(IKEv2)

可能是没有设置 remoteIdentifier 。

欢迎大神填坑。。。。

网络切换坑:

如果我们需要连接VPN后,切换网络VPN也能断线重连或者不掉线,可以使用IKEv2协议。IPSec协议默认情况下,切换网络会断开VPN。如果配置了按需连接的rule,可以实现切换网络断线重连,但是我们只能从app里关闭VPN了,无法从系统VPN设置里关闭VPN,因为关闭了也会断线重连,除非手动关闭按需连接。

六阿哥

目前评论:1   其中:访客  1   博主  0

  1. avatar Chenyihui 0

    我使用NetworkExtension.framework搭建了一个IPSec的VPN,连接失败,说是连接VPN协议失败,在服务器端显示“Aggressive Mode PSK disabled for security reasons”,由于不是Main Mode,而是Aggressive Mode,连接不了,这个Main Mode在哪更改?

评论加载中...

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: