You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复TorControlError: Authentication required认证错误引发的崩溃

问题:Tor服务控制连接认证失败导致应用崩溃

部分用户使用应用时因Tor服务崩溃,Crashlytics捕获到错误net.freehaven.tor.control.TorControlError: Error reply: Authentication required,该错误定位到ZlibApp.kt文件第101行的conn.setEvents(events)代码,但本地设备和模拟器无法复现此问题。

栈追踪信息

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:614)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)
Caused by: java.lang.reflect.InvocationTargetException: 
    java.lang.reflect.Method.invoke(Method.java:0)
    com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)
Caused by: net.freehaven.tor.control.TorControlError: Error reply: Authentication required.
    net.freehaven.tor.control.TorControlConnection.sendAndWaitForResponse(TorControlConnection.java:211)
    net.freehaven.tor.control.TorControlConnection.setEvents(TorControlConnection.java:590)
    com._.zlib.ZlibApp$onCreate$1.onServiceConnected(ZlibApp.kt:101)
    android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1771)
    android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1803)
    android.os.Handler.handleCallback(Handler.java:873)
    android.os.Handler.dispatchMessage(Handler.java:99)
    android.os.Looper.loop(Looper.java:224)
    android.app.ActivityThread.main(ActivityThread.java:7087)
    java.lang.reflect.Method.invoke(Method.java:0)
    com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)

相关代码(ZlibApp.kt)

//...
    override fun onCreate() {
        super.onCreate()
//...
        bindService(Intent(this, TorService::class.java), object : ServiceConnection {
            override fun onServiceConnected(name: ComponentName?, service: IBinder) {

                val torService: TorService = (service as TorService.LocalBinder).service
                while (torService.torControlConnection == null) {
                    try {
                        Thread.sleep(500)
                    } catch (e: InterruptedException) {
                        e.printStackTrace()
                    }
                }
                Timber.d( "Got Tor control connection, service proxy started")

                //now set our own events
                val events = ArrayList(
                    Arrays.asList(
                        TorControlCommands.EVENT_OR_CONN_STATUS,
                        TorControlCommands.EVENT_CIRCUIT_STATUS,
                        TorControlCommands.EVENT_NOTICE_MSG,
                        TorControlCommands.EVENT_WARN_MSG,
                        TorControlCommands.EVENT_ERR_MSG,
                        TorControlCommands.EVENT_BANDWIDTH_USED,
                        TorControlCommands.EVENT_NEW_DESC,
                        TorControlCommands.EVENT_ADDRMAP
                    )
                )
                if (BuildConfig.DEBUG) {
                    events.add(TorControlCommands.EVENT_DEBUG_MSG)
                    events.add(TorControlCommands.EVENT_INFO_MSG)
                    TorControlCommands.EVENT_STREAM_STATUS
                }

                val conn = torService.torControlConnection
                conn.setEvents(events)                     // this is 101 line
            }

            override fun onServiceDisconnected(p0: ComponentName?) {
                Timber.d( "Tor service proxy disconnected")
            }

        }, BIND_AUTO_CREATE)

        component = DaggerAppComponent.builder()
            .application(this)
            .build()
    }

解决方案

核心原因

Tor控制连接要求认证才能执行控制命令,但当前代码跳过了认证步骤直接调用setEvents,部分设备上Tor服务默认启用了认证机制,导致请求被拒绝。

修复步骤

  1. 添加认证流程
    在调用setEvents前完成Tor控制连接的认证。Android平台Tor服务通常默认使用Cookie认证,优先尝试该方式;若配置了固定密码,则使用密码认证:

    val conn = torService.torControlConnection
    try {
        // Cookie认证(多数Android Tor服务默认方式)
        conn.authenticateWithCookie()
        // 若Cookie认证失败,可切换为密码认证(替换为你的Tor控制密码)
        // conn.authenticate("your_tor_control_password")
        conn.setEvents(events)
    } catch (authError: TorControlError) {
        Timber.e(authError, "Tor控制连接认证失败")
        // 可添加重试逻辑或向用户展示错误提示
    }
    
  2. 模拟复现问题
    本地测试时,修改Tor配置强制开启认证:

    • 添加配置项ControlPort 9051和CookieAuthentication 1
    • 确保测试设备的Tor服务读取该配置,即可触发认证失败场景,验证修复效果
  3. 优化等待逻辑
    当前while循环休眠等待连接的方式易导致线程阻塞,建议改用Tor服务的就绪回调或状态监听,比如在TorService中添加onControlConnectionReady接口,避免无效休眠。

内容的提问来源于stack exchange,提问作者zlib-developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:47:03