当前位置: 首页 > 知识库问答 >
问题:

Swift-使用NEVPNManager连接到vpn

景昊焜
2023-03-14

我从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)
    })
  }
}

我不知道如何添加证书( in.ovpn)信息以及如何设置它。ovpn如下所示(我只是删除 标记中的数据并更改服务器地址:

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> 

谢谢你的帮助

共有2个答案

梁丘书
2023-03-14

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

戚甫
2023-03-14

这有点晚了,但你要明白这是两件完全不同的事情。

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

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

有一个客户端OpenVPN-connect for iOS,但它是专有的,并且是封闭源码的。您仍然可以从应用程序内部调用它,它将弹出给用户,如下所示:```Swift func actConnectButtonPressed(Sender:AnyObject){let 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上运行,下面是我学到的--建议使用共享密钥方法而不是无--共享密钥也必须保存在密钥链中--如果使用共享密钥,那么也要启用ExtendedAuthentication--确保在启动连接之前保存配置

希望这有帮助

 类似资料:
  • 当我试着检查我的iPhone上的互联网连接时,我得到了一堆错误。有谁能帮我修好这个吗? 代码: 代码中的错误: 如果无法读取,则错误1表示: “int”不能转换为“scNetworkReachabilityFlags” 错误2&3: 找不到接受所提供参数的“init”的重载

  • 问题内容: 当我尝试在iPhone上检查互联网连接时,出现了很多错误。谁能帮我解决这个问题? 代码: 代码错误: 如果无法读取,则错误1表示: “ Int”不可转换为“ SCNetworkReachabilityFlags” 错误2和3: 找不到接受提供的参数的’init’的重载 问题答案: 为了解决注释中提到的4G问题,我已使用@AshleyMills可达性实现作为参考并重写了Swift 3.1

  • 如何使用套接字将Swift客户端连接到Java服务器?如何在客户端和服务器之间发送不同的数据类型?

  • 在Xcode6中尝试将导航栏按钮连接到ViewController的Exit项时(不确定这是否是Xcode6的问题,但在beta中值得一提),在自定义类中找不到Swift函数。 它应该找到的功能: 我在视图上做了另一个按钮,以确保我可以使用Swift获得一个IBAction并且我正确地编写了它。这很管用: Xcode6是测试版,当然,Swift也是新版本,但我想看看是否有人在认为它是一个潜在的bu

  • 问题内容: 我是Redis的新手…我最近刚拿起Redisent来在PHP中使用Redis …并且我玩得很开心!但是,我注册了Redis服务,并一直在努力使用该服务… URI字符串如下: redis:// [用户名]:[pass] @ [服务器] .redistogo.com:[端口] / Redisent客户端只需输入主机名和端口…并且我没有地方输入用户名/密码…:-/我也一直在摆弄fsockop

  • 问题内容: 我正在尝试使用SQL来构建.NET Web应用程序以查询AS400数据库。这是我第一次遇到AS400。 为了连接,我必须在我的机器(或AS400服务器)上安装什么?(用于Windows的IBM iSeries Access?) 连接字符串的组成部分是什么? 在哪里可以找到使用SQL命令构建数据访问层的示例代码? 谢谢。 问题答案: 您需要AS400 .Net数据提供程序。在这里检查:h