Pergunta sobre android, vpn, android-4.0-ice-cream-sandwich – Definir uma conexão VPN programaticamente no android 4.0

22

Eu estou trabalhando em definir programaticamente uma conexão VPN em dispositivos Android. Eu consegui fazer isso com sucesso para dispositivos que usam o OS 2.3.5 e antes (usei a reflexão para acessar as classes ocultas). Mas com o Android 4.0 eles se livraram das classes antigas e usaram a classe VPNService.

Imaginei que o melhor lugar para começar seria usar o exemplo do Android do ToyVPN, mas estou enfrentando muitos desafios com ele. No código de exemplo, eles precisavam apenas enviar o endereço do servidor:

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

E então criei o túnel VPN abrindo o canal:

tunnel = DatagramChannel.open();

Mas no meu caso eu preciso enviar o endereço do servidor, nome de usuário e senha. Até agora eu não descobri como fazer isso. Meu melhor palpite era fazer algo assim:

Authenticator.setDefault(new Authenticator(){
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("user","pass".toCharArray());
        }});

    try {
        // Create a DatagramChannel as the VPN tunnel.

        tunnel = DatagramChannel.open();

Mas isso não funcionou. então o que eu estou perguntando é:

Existe uma maneira, diferente do que é usado no ToyVpn, para criar uma conexão VPN programaticamente?Se não, como envio as credenciais quando desejo estabelecer uma conexão com o servidor?

Editar

Esqueci de mencionar que preciso especificar o tipo de VPN (PPTP, L2TP, L2TP / IPSec PSK ou L2TP / IPSec CRT).

@Ahmad, você encontrou uma solução? Eu preciso da solução também user6689631
@ kh_4 Você encontra alguma solução sobre isso? Kristiyan Varbanov
Eu também estou procurando a resposta dessas perguntas, você pode compartilhar suas descobertas blackfyre
ainda não tem solução? TharakaNirmana

Sua resposta

2   a resposta
8

a API VPN introduzida no Android 4.0+ apenas permite implementarseu próprio Implementação VPN. Ele não faz mais do que abrir o dispositivo TUN do Linux e passar o descritor de arquivo para você, além de configurar as rotas / servidores DNS / etc fornecidos por você. Toda a implementação do protocolo VPN é da sua exclusiva responsabilidade.

Então a resposta curta é: não. você não pode usara API da VPN para configurar qualquer um dos

PPTP, L2TP, L2TP / IPSec PSK ou L2TP / IPSec CRT

Conexões VPN, a menos que você implemente sua própria implementação dos tipos de VPN mencionados.

Dito isto, você ainda pode tentar transmitir um Intent para trazer seu usuário para a atividade de configurações de VPN do sistema e pedir que ele configure / inicie manualmente a VPN.

Ah e mais uma coisa para adicionar. No momento em que este artigo foi escrito, o mais recente DevicePolicyManager do Android (API nível 21) jáSuporte de aprovisionamento de configurações de WiFi. Eu pessoalmente acho que o Google pode continuar a adicionar maisAndroid for Work recursos, que podem incluir suporte de provisionamento VPN que você precisa.I / O 2015 está a poucos dias de distância, então vamos esperar e ver ...

3

pode querer dar uma olhadaOpenVPN para Android (ics-openvpn) fonte do projeto. Se não houver necessidade de o seu aplicativo fazer a conexão diretamente, você também poderá usar intents para acionar uma conexão do ics-openvpn. O OpenVPN oferece uma ampla gama de configurações, mas você ainda precisa ver se é compatível com o seu servidor.

A classe VpnService introduzida no Android 4.0 (ICS) só pode fazer algumas configurações, como a criação da interface de rede (somente modo tun), algumas rotas e servidores DNS. Ainda é necessário que seu aplicativo possa se conectar sem permissão de root. Você pode querer verificarAqui para mais informações sobre como usar o VpnService.

Até onde eu explorei o código do ics-openvpn, o aplicativo integra um binário OpenVPN executável no APK do aplicativo. O aplicativo executa este binário, enviando e recebendo comandos através de um soquete local. O binário cuida de quase tudo, você só tem que analisar a entrada para saber quais métodos de VpnService.Builder você estará chamando, e quais informações você estará enviando de volta através do soquete (isso inclui confirmações, arquivos de configuração, credenciais, bytecounts , etc)

Perguntas relacionadas