1

我将 Delphi XE8 与 Indy 10 一起用于 Android 应用程序开发。我已将该TIdHTTP组件用于 HTTP/S 服务调用。

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

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

请帮助我。

4

2 回答 2

6

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

Android 6.0 变化 - BoringSSL

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

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

#166 在 Android 6 上支持 BoringSSL

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

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

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

于 2017-08-03T16:12:03.443 回答
3

我试过TNetHTTPClient,它适用于HTTPS协议。

于 2017-08-09T06:59:49.540 回答