在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)); 

然后打开通道创buildVPN隧道:

 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中使用,以编程方式创buildVPN连接?
  2. 如果不是,我想在build立到服务器的连接时如何发送证书?

编辑

我忘了提及我需要指定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的实施。

话虽如此,你仍然可以尝试广播一个意图,让你的用户进入系统的VPN设置活动,并要求他们手动configuration/启动VPN。

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

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

在Android 4.0(ICS)中引入的VpnService类只能做一些设置,比如创buildnetworking接口(只有tun模式),一些路由和DNS服务器。 您的应用仍然需要能够在没有root权限的情况下进行连接。 你可能想在这里查看关于如何使用VpnService的更多信息。

据我所探讨的ics-openvpn的代码,该应用程序集成了一个可运行在应用程序的APK中的OpenVPN二进制文件。 应用程序执行这个二进制文件,通过本地套接字发送和接收命令。 二进制文件几乎处理所有的事情,你只需要parsinginput来知道你将调用什么VpnService.Builder的方法,你将通过套接字发送什么信息(这包括确认,configuration文件,证书,等)