【问题标题】:Android 6.0 Application crashes when I use TIdHTTP for HTTPS calls当我使用 TIdHTTP 进行 HTTPS 调用时,Android 6.0 应用程序崩溃
【发布时间】:2018-01-10 21:53:10
【问题描述】:

我正在使用 Delphi XE8 和 Indy 10 进行 Android 应用程序开发。我已经使用TIdHTTP 组件进行 HTTP/S 服务调用。

它在 Android 5 及更早版本中运行良好,但在 Android 6.0 中无法正常运行(当我尝试访问 HTTPS 协议时)。

我尝试使用TIdSSLIOHandlerSocketOpenSSL,但当我调用任何服务方法(如 PUT、POST、GET)时,应用程序仍然崩溃。

请帮帮我。

【问题讨论】:

  • 我敢打赌这是一个 NetworkOnMainThreadException。谷歌一下。

标签: android delphi indy idhttp boringssl


【解决方案1】:

Indy 对 SSL/TLS 的本机支持在 Android 6+ 上被破坏(嗯,不完整),因为 Google 在 Android 6 中放弃了对 OpenSSL 的支持,转而使用他们自己的内部修改分支 BoringSSL:

Android 6.0 Changes - BoringSSL

Android 正在从 OpenSSL 迁移到 BoringSSL 库。如果您在您的应用中使用 Android NDK [Delphi Android 应用会这样做],请不要链接到不属于 NDK API 的加密库,例如 libcrypto.so 和 libssl.so强>。这些库不是公共 API,可能会在不同版本和设备之间更改或中断,恕不另行通知。此外,您可能会将自己暴露在安全漏洞中。相反,修改您的本机代码以通过 JNI 调用 Java 加密 API 或静态链接到您选择的加密库

TIdSSLIOHandlerSocketOpenSSL 不适用于 BoringSSL,并且 Indy 目前没有另一个用于 BoringSSL 的 SSLIOHandler 类。这是一个尚未解决的未解决问题:

#166 Support BoringSSL on Android 6

在解决之前(并且没有 ETA),您必须:

  1. 使用您的 Android 应用部署适用于 Android 的 OpenSSL 二进制文件(可从 https://indy.fulgan.com/SSL/ 获得),并指示 Indy 在运行时从何处加载它们。但根据设备和系统配置,这可能会也可能不会。人们在这件事上的结果喜忧参半。

  2. 编写您自己的 TIdSSLIOHandlerSocketBase 派生类,该类使用 Java 套接字 API 而不是 C 库 BSD 套接字和 OpenSSL。

【讨论】:

【解决方案2】:

我已尝试使用 TNetHTTPClient ,它适用于 HTTPS 协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多