如何修复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服务默认启用了认证机制,导致请求被拒绝。
修复步骤
添加认证流程
在调用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控制连接认证失败") // 可添加重试逻辑或向用户展示错误提示 }模拟复现问题
本地测试时,修改Tor配置强制开启认证:- 添加配置项
ControlPort 9051和CookieAuthentication 1 - 确保测试设备的Tor服务读取该配置,即可触发认证失败场景,验证修复效果
- 添加配置项
优化等待逻辑
当前while循环休眠等待连接的方式易导致线程阻塞,建议改用Tor服务的就绪回调或状态监听,比如在TorService中添加onControlConnectionReady接口,避免无效休眠。
内容的提问来源于stack exchange,提问作者zlib-developer
相关产品推荐
相关产品推荐

