【问题标题】:Creating VPN by using OpenVPN使用 OpenVPN 创建 VPN
【发布时间】:2019-12-19 08:54:28
【问题描述】:

我在 Android 10 上连接 VPN 并在 logcat 中收到以下消息时遇到问题。 这是权限错误。寻找解决方案。 还在 Mainfest 中添加了 android:requestLegacyExternalStorage="true" 但对我不起作用。

D/ConnectionStatus:IO Exceptionjava.io.IOException:无法运行程序“/data/user/0/com.casvpnapp/cache/pie_openvpn.x86_64”:错误=13,权限被拒绝

D/de.blinkt.openvpn.core.OpenVPNService: onStartCommand: Australia
I/VpnState: VPN_GENERATE_CONFIG  LEVEL_START
D/ConnectionStatus: ---/data/user/0/com.casvpnapp/cache/android.conf
D/ConnectionStatus: ---/data/user/0/com.casvpnapp/cache/android.conf
D/de.blinkt.openvpn.core.OpenVPNService: startOpenVPN: argv:3
D/ConnectionStatus: --[Ljava.lang.String;@ef1521a
I/OpenVPN: Starting openvpn  [Ljava.lang.String;@ef1521a
D/ConnectionStatus: ---29
    startOpenVPNThread---/data/user/0/com.casvpnapp/cache/pie_openvpn.x86_64
D/ConnectionStatus: IO Exceptionjava.io.IOException: Cannot run program "/data/user/0/com.casvpnapp/cache/pie_openvpn.x86_64": error=13, Permission denied
E/OpenVPN: OpenVPNThread Got java.lang.NullPointerException: Attempt to invoke virtual method 'void java.lang.Process.destroy()' on a null object reference
I/VpnState: NOPROCESS No process running. LEVEL_NOTCONNECTED
W/Thread-20: type=1400 audit(0.0:55): avc: granted { execute } for name="pie_openvpn.x86_64" dev="vdc" ino=23035 scontext=u:r:untrusted_app:s0:c139,c256,c512,c768 tcontext=u:object_r:app_data_file:s0:c139,c256,c512,c768 tclass=file app=com.casvpnapp
I/OpenVPN: Exiting

【问题讨论】:

    标签: java android connection openvpn android-10.0


    【解决方案1】:

    我最近遇到了完全相同的问题。我使用的是 EasyVPN-Free 的克隆。经过仔细检查,我发现这些应用程序中的大多数都使用相同的方法并使用旧版本的 ics-openvpn 内核。

    看起来您还在您的应用程序中使用旧版本的 ics-openvpn,它与 android 10 不兼容,因为它试图通过从资产加载 ovpn 二进制文件(而不是为此使用 JNI lib)来启动一个进程,这是被禁止的安卓 10。

    要解决此问题,请在 VPNLaunchHelper.java 类中找到以下方法:

    private static String writeMiniVPN(Context context)
    

    在开头添加以下几行

    String nativeAPI = NativeUtils.getNativeAPI();
    /* Q does not allow executing binaries written in temp directory anymore */
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
        return new File(context.getApplicationInfo().nativeLibraryDir, "libovpnexec.so").getPath();
    

    现在找到以下行并评论/删除它:

    String nativeAPI = NativeUtils.getNativeAPI();
    

    [更新]

    最初由 Md. Ikramul Murad 建议

    在清单文件中添加以下代码:

    <application     android:extractNativeLibs="true"     ... >
    

    现在为您的目标平台获取 libovpnexec.so 并将它们适当地粘贴到您应用的 jniLibs 文件夹中,这应该可以修复您在 android 上的异常。

    你可以参考这个EasyVPN-Free fork 我专门用来解决这个问题的。

    我希望这将帮助所有可能遇到相同问题的其他人。

    【讨论】:

    • 请注意这是不推荐的。不要使用您自己构建的库来修复旧版本的软件,而应该只使用上游软件的最新版本。由于 VPN 软件对安全性敏感,因此没有理由使用旧版本。
    • 是的。对于那些想要暂时解决问题的人来说,它只是一个创可贴。正确的做法是将库升级到最新版本。
    • 我已按照您的指示在 jniLibs 文件夹中添加了 libovpnexec.so 文件。但我有以下错误:W/System.err: java.io.IOException: Cannot run program "/data/app/&lt;appID&gt;-&lt;Token&gt;==/lib/arm64/libovpnexec.so": error=2, No such file or directory
    • 我在清单文件中添加了以下代码:&lt;application android:extractNativeLibs="true" ... &gt; 现在可以正常工作了。
    • 谢谢,这就像一个魅力!正如@Md.IkramulMurad 所说,我们必须在清单文件中添加此标记以及 VPNLaunchHelper.java 中的更改。
    【解决方案2】:

    您的 OpenVPN 库似乎有问题。 虽然我还开发了一个基于 OpenVPN 库的 VPN 应用程序,但它对我来说运行良好。你可以查看我的源代码。

    https://github.com/ashraf789/Cake-VPN

    【讨论】:

    • 谢谢@Vicky 先生。现在问题已解决,您也可以在 android 30 上使用
    • @Ashraf789 它不适用于 minSdkVersion > 22. 如何处理?
    • 好吧,让我检查一下。
    • @Ashraf789 你能告诉我你如何解决targetSdkVersion 29的问题
    • 我无法连接到 targetSdkVersion 29,请您建议我应该怎么做。我从你的回购中复制了,如果 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) return new File(context.getApplicationInfo().nativeLibraryDir, "libovpnexec.so").getPath();但它实际上在建立连接时停留在 ipv6 的 add-route 案例。
    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 2020-07-11
    • 2022-01-09
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多