Establecer una conexión VPN programáticamente en Android 4.0
android-4.0-ice-cream-sandwich (2)
Estoy trabajando para configurar mediante programación una conexión VPN en dispositivos Android. Pude hacerlo con éxito para dispositivos que usaban OS 2.3.5 y antes (usé la reflexión para llegar a las clases ocultas). Pero con Android 4.0 se deshicieron de las clases anteriores y usaron la clase VPNService en su lugar.
Pensé que el mejor lugar para comenzar sería utilizar el ejemplo de Android de ToyVPN provisto, pero me enfrento a muchos desafíos. En el código de ejemplo solo necesitaban enviar la dirección del servidor:
InetSocketAddress server = new InetSocketAddress(mServerAddress, Integer.parseInt(mServerPort));
Y luego creó el túnel VPN abriendo el canal:
tunnel = DatagramChannel.open();
Pero en mi caso necesito enviar la dirección del servidor, nombre de usuario y contraseña. Hasta ahora no he descubierto cómo hacerlo. Mi mejor conjetura fue hacer algo como esto:
Authenticator.setDefault(new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user","pass".toCharArray());
}});
try {
// Create a DatagramChannel as the VPN tunnel.
tunnel = DatagramChannel.open();
Pero esto no funciono. así que lo que pregunto es:
- ¿Hay alguna otra manera, aparte de lo que se usa en ToyVpn, para crear una conexión VPN programáticamente?
- Si no, ¿cómo envío las credenciales cuando quiero establecer una conexión con el servidor?
Editar
Olvidé mencionar que necesito especificar el tipo de VPN (PPTP, L2TP, L2TP / IPSec PSK o L2TP / IPSec CRT).
Básicamente, la API de VPN introducida en Android 4.0+ solo le permite implementar su propia implementación de VPN. No hace más que abrir el dispositivo Linux TUN y pasarle el descriptor de archivo, además de configurar las rutas / servidores DNS / etc que proporcionó. Toda la implementación del protocolo VPN depende exclusivamente de usted.
Así que la respuesta corta es: no. no puede utilizar la API de VPN para configurar cualquiera de los
PPTP, L2TP, L2TP / IPSec PSK o L2TP / IPSec CRT
Conexiones de VPN, a menos que despliegue su propia implementación de los tipos de VPN mencionados.
Dicho esto, aún puede intentar transmitir un Intent para llevar a su usuario a la actividad de configuración de VPN del sistema y pedirle que configure / inicie manualmente la VPN.
Ah y una cosa más para agregar. En el momento de escribir este artículo, el último DevicePolicyManager (nivel de API 21) de Android ya ofrece soporte para el aprovisionamiento de la configuración de WiFi . Personalmente, creo que Google podría seguir agregando más funciones de Android for Work , que pueden incluir el soporte de VPN que necesita. I / O 2015 está a solo unos días, así que esperemos y veamos ...
Hay una manera de establecer una conexión VPN programáticamente. Es posible que desee echar un vistazo a la fuente del proyecto OpenVPN para Android (ics-openvpn) . Si no es necesario que la aplicación realice la conexión directamente, también puede utilizar los intentos para activar una conexión desde ics-openvpn. OpenVPN ofrece una amplia gama de configuraciones, pero aún tiene que ver si es compatible con su servidor.
La clase VpnService introducida en Android 4.0 (ICS) solo puede realizar algunos ajustes, como la creación de la interfaz de red (solo en modo tun), algunas rutas y servidores DNS. Todavía se necesita para que su aplicación pueda conectarse sin permiso de root. Es posible que desee consultar here para obtener más información sobre cómo utilizar VpnService.
Hasta donde he explorado el código ics-openvpn, la aplicación integra un binario OpenVPN ejecutable en la APK de la aplicación. La aplicación ejecuta este binario, enviando y recibiendo comandos a través de un socket local. El binario se ocupa de casi todo, solo tiene que analizar la entrada para saber qué métodos de VpnService.Builder llamará y qué información enviará a través del socket (esto incluye confirmaciones, archivos de configuración, credenciales, cuentas de byte). , etc)