我正在以编程方式在Android设备上设置VPN连接。我成功地使用OS 2.3.5和之前的设备(我使用反射来访问隐藏的类)。但是在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();
但是这没用。 所以我要问的是:
修改
我忘了提到我需要指定VPN类型(PPTP,L2TP,L2TP / IPSec PSK或L2TP / IPSec CRT)。
答案 0 :(得分:8)
基本上,Android 4.0+中引入的VPN API只允许您实施您自己的 VPN实施。它只不过是打开Linux TUN设备并将文件描述符传递给您,以及设置您提供的路由/ DNS服务器/等。整个VPN协议实现完全取决于您。
所以简短的回答是:不。您无法使用 VPN API 来设置任何
PPTP,L2TP,L2TP / IPSec PSK或L2TP / IPSec CRT
VPN连接,除非您推出自己实现的上述VPN类型。
话虽这么说,您仍然可以尝试广播一个Intent,让您的用户进入系统VPN设置活动,并要求他们手动配置/启动VPN。
哦,还有一件事要补充。在撰写本文时,Android的最新DevicePolicyManager(API级别21)已提供WiFi settings provisioning support。我个人猜测Google可能会继续添加更多Android for Work功能,其中可能包括您需要的VPN配置支持。 I/O 2015仅在几天之后,让我们拭目以待......
答案 1 :(得分:3)
有一种方法可以通过编程方式设置VPN连接。您可能想看看OpenVPN for Android (ics-openvpn)项目的来源。如果您的应用程序不需要直接建立连接,您还可以使用意图来触发来自ics-openvpn的连接。 OpenVPN提供了多种设置,但您仍需要查看它是否与您的服务器兼容。
Android 4.0(ICS)中引入的VpnService类只能执行一些设置,例如创建网络接口(仅限tun模式),某些路由和DNS服务器。您的应用仍然需要能够在没有root权限的情况下进行连接。您可能需要查看here以获取有关如何使用VpnService的更多信息。
据我探索过ics-openvpn的代码,该应用程序集成了一个可在应用程序的APK中运行的OpenVPN二进制文件。应用程序执行此二进制文件,通过本地套接字发送和接收命令。二进制文件几乎可以处理所有内容,您只需要解析输入以了解您将调用的VpnService.Builder的哪些方法,以及您将通过套接字发回哪些信息(这包括确认,配置文件,凭据,字节数等等)