在android 4.0上以编程方式设置VPN连接

我正在以编程方式在Android设备上设置VPN连接。 我成功地使用OS 2.3.5和之前的设备(我使用reflection来访问隐藏的类)。 但是在android 4.0中,他们摆脱了旧类并使用了VPNService类。

我认为最好的起点是使用Android提供的ToyVPN示例,但我面临很多挑战。 在示例代码中,他们只需要发送服务器地址:

InetSocketAddress server = new InetSocketAddress(mServerAddress, Integer.parseInt(mServerPort)); 

然后通过打开频道创建VPN隧道:

 tunnel = DatagramChannel.open(); 

但在我的情况下,我需要发送服务器地址,用户名和密码。 到目前为止,我还没有想出如何这样做。 我最好的猜测是做这样的事情:

 Authenticator.setDefault(new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("user","pass".toCharArray()); }}); try { // Create a DatagramChannel as the VPN tunnel. tunnel = DatagramChannel.open(); 

但这没效果。 所以我要问的是:

  1. 除了在ToyVpn中使用的方法之外,还有一种方法可以通过编程方式创建VPN连接吗?
  2. 如果没有,当我想建立与服务器的连接时,如何发送凭据?

编辑

我忘了提到我需要指定VPNtypes(PPTP,L2TP,L2TP / IPSec PSK或L2TP / IPSec CRT)。

Solutions Collecting From Web of "在android 4.0上以编程方式设置VPN连接"

基本上,Android 4.0+中引入的VPN API只允许您实现自己的 VPN实现。 它只不过是打开Linux TUN设备并将文件描述符传递给您,以及设置您提供的路由/ DNS服务器/等。 整个VPN协议实现完全取决于您。

所以简短的回答是:不。 你不能使用VPN API来设置任何一个

PPTP,L2TP,L2TP / IPSec PSK或L2TP / IPSec CRT

VPN连接,除非您推出自己提到的VPNtypes的实现。

话虽这么说,你仍然可以尝试广播一个Intent,让你的用户进入系统VPN设置活动,并要求他们手动配置/启动VPN。

哦,还有一件事要补充。 在撰写本文时,Android的最新DevicePolicyManager(API级别21)已经提供了WiFi设置配置支持 。 我个人猜测Google可能会继续添加更多Android for Workfunction,其中可能包括您需要的VPN配置支持。 I / O 2015距离我们只有几天,所以让我们拭目以待……

有一种方法可以通过编程方式设置VPN连接。 您可能想看看OpenVPN for Android(ics-openvpn)项目的源代码。 如果您的应用程序不需要直接建立连接,您还可以使用意图来触发来自ics-openvpn的连接。 OpenVPN提供了多种设置,但您仍需要查看它是否与您的服务器兼容。

Android 4.0(ICS)中引入的VpnService类只能执行一些设置,例如创建网络接口(仅限tun模式),某些路由和DNS服务器。 您的应用仍然需要能够在没有root权限的情况下进行连接。 您可能需要在此处查看有关如何使用VpnService的更多信息。

至于我已经探索了ics-openvpn的代码,该应用程序集成了一个可在应用程序的APK中运行的OpenVPN二进制文件。 应用程序执行此二进制文件,通过本地套接字发送和接收命令。 二进制文件几乎可以处理所有内容,您只需要解析输入以了解您将调用的VpnService.Builder的哪些方法,以及您将通过套接字发回的信息(包括确认,配置文件,凭据,字节数)等)