Android 当我使用 TIdHTTP 进行 HTTPS 调用时,6.0 应用程序崩溃

Android 6.0 Application crashes when I use TIdHTTP for HTTPS calls

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

它在 Android 5 和更早的版本中工作正常,但在 Android 6.0 中不起作用(当我尝试访问 HTTPS 协议时)。

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

请帮我解决这个问题。

Indy 的 native 对 SSL/TLS 的支持在 Android 6+ 上被破坏(嗯,不完整),因为 Google 放弃了对 OpenSSL 的支持在Android 6、切换到自己内部修改的名为BoringSSL的fork:

Android 6.0 Changes - BoringSSL

Android is moving away from OpenSSL to the BoringSSL library. If you’re using the Android NDK in your app [which Delphi Android apps do], don't link against cryptographic libraries that are not a part of the NDK API, such as libcrypto.so and libssl.so. These libraries are not public APIs, and may change or break without notice across releases and devices. In addition, you may expose yourself to security vulnerabilities. Instead, modify your native code to call the Java cryptography APIs via JNI or to statically link against a cryptography library of your choice.

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

#166 Support BoringSSL on Android 6

在问题解决之前(并且没有预计到达时间),您将必须:

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

  2. 编写您自己的 TIdSSLIOHandlerSocketBase-derived class,它使用 Java 套接字 API 而不是 C 库 BSD 套接字和 OpenSSL。

我已经尝试使用 TNetHTTPClient ,它在 HTTPS 协议下运行良好。