在我的 Android 应用程序中,我尝试连接并将文件上传到我的 FTPS 服务器(使用端口 21),这本质上是带有 TLS 的 FTP。该服务器是 FileZilla 服务器,可以与 FileZilla 客户端完美配合。我正在为 FTPS 客户端使用以下库:
梯度
implementation 'commons-net:commons-net:3.11.1' // FTP
但是,当我在连接并登录后尝试列出目录或列出名称时,遇到以下错误:
425 无法建立数据连接:数据连接的 TLS 会话未恢复。
根据我的研究,我发现 Apache Commons Net 库不支持 TLS 连接恢复,这是重用相同的 TLS 会话进行安全文件传输所必需的。
我遇到了这个 StackOverflow 线程:如何使用相同的 TLS 会话通过数据连接连接到 FTPS 服务器?并且已经尝试实施那里提到的解决方案,但它们对我不起作用。
我尝试了几种解决方案,包括:
面对错误(类Lcom/android/org/conscrypt/ClientSessionContext中没有字段sessionByHostAndPort;(“com.android.org.conscrypt.ClientSessionContext”的声明出现在/apex/com.android.conscrypt/javalib/conscrypt.jar中) ))
梯度
implementation 'org.bouncycastle:bctls-jdk18on:1.78.1'
但是,这并没有解决问题。
_prepareDataSocket_
方法,但这也没有按预期工作。鉴于我的 FTPS 客户端正在为每个文件传输创建一个新的 TLS 会话,而服务器希望重用与控制连接相同的安全会话,我正在寻找有关如何为数据连接或任何其他连接维护相同 TLS 会话的指导。其他可以帮助解决此问题的解决方案。
对于每个面临同样问题的人来说,我花了2-3天的时间通过Stack Overflow搜索、阅读博客等终于找到了解决方案。我从Stack Overflow上的ferpalos的回答得到了帮助。但是,我还必须按照 TomInCode 的建议添加 RestrictionBypass 依赖项。现在,连接问题已解决。但是,我仍然不确定使用 RestrictionBypass 是否完全安全。