【问题标题】:Swift - Connect to vpn using NEVPNManagerSwift - 使用 NEVPNManager 连接到 vpn
【发布时间】:2016-02-28 16:14:23
【问题描述】:

我从 Android 获得 .ovpn 文件,我有用户名和密码,我应该连接到 vpn 服务器,但我不知道该怎么做。我尝试过这样的事情:

let manager = NEVPNManager.sharedManager()
manager.loadFromPreferencesWithCompletionHandler { (error) -> Void in
  if manager.`protocol`  == nil {
    let newIPSec = NEVPNProtocolIKEv2()
    newIPSec.serverAddress = "xxx.xxx.xxx.xxx"
    newIPSec.username = "username"
    let keychain = Keychain(service: "com.app.ios")
    let data = keychain[data: "vpnpassword"]
    newIPSec.passwordReference = data
    newIPSec.authenticationMethod = NEVPNIKEAuthenticationMethod.None
    newIPSec.disconnectOnSleep = false

    manager.`protocol` = newIPSec
    manager.enabled = true

    manager.saveToPreferencesWithCompletionHandler({ (error) -> Void in
      print(error)
    })
  }
}

我不知道如何添加证书(在.ovpn 中的<ca> 之间)信息以及如何设置它。文件 .ovpn 看起来像这样(我只是删除 <ca> 标签中的数据并更改服务器地址:

client
dev tun
proto udp
remote xx.xx.xx.xx 443
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3

<auth-user-pass>
#username#
#userpass#
</auth-user-pass>

cipher AES-256-CBC
<ca>
-----BEGIN CERTIFICATE-----
xxx
-----END CERTIFICATE-----
</ca> 

感谢您的帮助

【问题讨论】:

    标签: ios swift ios9 vpn nevpnmanager


    【解决方案1】:

    这有点晚了,但你要明白这是两个完全不同的东西。

    在撰写此答案时,NetworkExtension API(我有 iOS 9.3.4)支持两种协议: - 使用 IKEv1 的 IPSec - AEP 和证书 (IKEv2)

    您的服务器是 OpenVPN 服务器。目前没有用于 OpenVVPN 的 API(如果您遇到任何 API,请告诉我)。那么第一个问题,你的 VPN Server 支持 IKEv1 还是 v2?

    有适用于 iOS 的客户端 OpenVPN-connect,但它是专有和封闭源代码。您仍然可以从应用程序内部调用它,它会弹出给用户,如下所示: ```迅速 func actConnectButtonPressed(发件人:AnyObject){ 让 app:UIApplication = UIApplication.sharedApplication()

        let alert = UIAlertController(title: "Warning", message: "OpenVPN Connect needs to be installed to process .ovpn configuration files on your device. Go to OpenVPN Connect page in AppStore?", preferredStyle: UIAlertControllerStyle.Alert)
    
        alert.addAction(UIAlertAction(title: "Yes", style: .Default, handler: { (action: UIAlertAction!) in
            app.openURL(NSURL(string: "https://itunes.apple.com/app/id590379981?mt=8")!)
        }))
    
        alert.addAction(UIAlertAction(title: "No", style: .Default, handler: { (action: UIAlertAction!) in
            let server:Server = self.api.findServerByName(self.settings.loadValue(SettingsController.keyServerName, defValue: "") as! String)!
            let protocolPort:Int = self.settings.loadValue(SettingsController.keyProtocolPort, defValue: 0) as! Int
            app.openURL(NSURL(string: self.api.getOvpnConfigURL(server, proto: self.protocolAndPorts[protocolPort]))!)
        }))
        presentViewController(alert, animated: true, completion: nil)
    
    }
    

    ```

    这个例子来自 safejump 客户端。看看这里 https://github.com/proxysh/Safejumper-for-iOS

    我自己仍在尝试让 IPSec 客户端以编程方式在 iOS 上运行,这就是我所学到的 - 建议使用共享密钥方法而不是 None - 共享密钥也必须保存在密钥链中 - 如果您使用共享密钥,那么还要启用 ExtendedAuthentication - 确保在启动连接之前保存配置

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      您正在使用 NEVPNProtocolIKEv2 连接到 openVPN 服务器。 个人 VPN 仅支持带有 ike v1 和 v2 的 ipsec(AEP 和证书身份验证)

      【讨论】:

      • 我也尝试过 ipsec 但没有运气。我想我需要共享秘密或其他东西,但我不知道如何从 .ovpn 中的证书中获取信息
      • 第一次尝试创建 vpn 连接时,我使用了 hide.me 服务器,因为它们在同一端点上拥有所有主要的 vpn 协议。您应该尝试与他们的服务器建立连接并从那里开始工作。我设法连接到他们的 IKEv1 和 IKEv2 服务器。我和我的后端同事在尝试制作与苹果兼容的 vpn 时遇到了很多麻烦。这是很多试验和错误。
      猜你喜欢
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2018-07-14
      • 2019-11-28
      相关资源
      最近更新 更多