L2TP / IPSec PSK VPN を使ってアプリケーション内で接続、通信 → root化しないと無理 orz
[Android]VPNに接続し、VPN接続状態を検知する方法(PPTPのみ確認) - chakimarの日記
PPTPでの成功例があったので、L2TPも楽勝かと思いきや以下のエラーが。
01-04 16:49:40.730: ERROR/racoon(1685): couldn't find the pskey for ***.***.***.***. 01-04 16:49:40.730: ERROR/racoon(1685): failed to process packet. 01-04 16:49:40.730: ERROR/racoon(1685): phase1 negotiation failed. 01-04 16:49:40.730: INFO/racoon(1685): KA remove: 10.21.186.215[4500]->***.***.***.***[4500] 01-04 16:50:09.249: ERROR/racoon(1685): phase2 negotiation failed due to time up waiting for phase1. ESP ***.***.***.***[0]->10.21.186.215[0]
PSKの渡し方が間違っているのかなと思ってソースを見るも、特に変わったところはない。同じことをやっているアプリをいろいろと探していたら答えがあった。
http://code.google.com/p/xinkvpn/wiki/VpnKeystoreIssue
要するに、/system/bin/keystoreのkeyをエンコーディングする仮定で、uidを参照する場所があってユーザ権限だと上手くいかないよ、と。
回避するには、プログラムをroot権限で実行するか、keystoreを書き換えるか。どちらにせよroot化が必要な作業となる。