我将 Delphi XE8 与 Indy 10 一起用于 Android 应用程序开发。我已将该TIdHTTP
组件用于 HTTP/S 服务调用。
它在 Android 5 及更早版本中运行良好,但在 Android 6.0 中却无法正常运行(当我尝试访问 HTTPS 协议时)。
我试过了TIdSSLIOHandlerSocketOpenSSL
,但当我调用任何服务方法(如 PUT、POST、GET)时,应用程序仍然崩溃。
请帮助我。
Indy 对 SSL/TLS 的原生支持在 Android 6+ 上被破坏(嗯,不完整),因为 Google 在 Android 6 中放弃了对 OpenSSL 的支持,转而使用他们自己的内部修改分支 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),您必须:
使用您的 Android 应用程序部署适用于 Android 的 OpenSSL 二进制文件(可从https://indy.fulgan.com/SSL/获得),并指示 Indy 在运行时从何处加载它们。但根据设备和系统配置,这可能会也可能不会。人们在这件事上的结果喜忧参半。
编写您自己的TIdSSLIOHandlerSocketBase
派生类,该类使用 Java 套接字 API 而不是 C 库 BSD 套接字和 OpenSSL。
我试过TNetHTTPClient,它适用于HTTPS协议。