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

标签 android delphi indy idhttp boringssl

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

它在 Android 5 及更早版本中运行良好,但在 Android 6.0 中却不起作用(当我尝试访问 HTTPS 协议(protocol)时)。

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

请帮我解决这个问题。

最佳答案

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

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 类。这是一个尚未解决的开放问题:

#166 Support BoringSSL on Android 6

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

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

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

关于当我使用 TIdHTTP 进行 HTTPS 调用时,Android 6.0 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45481722/

相关文章:

android - 有没有办法在 rx-java/kotlin 中对 groupBy 键进行排序?

android - keyOutputText 在软键盘上不起作用

delphi - "Stay on top"Delphi XE中的主窗体和模式对话框

android - 使用 IBM Watson Android sdk 将音频文件写入 websocket

android - 将应用程序的 Beta 版本发布为生产版本

delphi - 什么是 .tfc 文件以及如何使用它

delphi - Win8设置系统还原点的方法

delphi - 终止来自 TIdTCPServer 的非事件套接字连接

Delphi Indy 登录并下载文件

Delphi发送HTTP GET请求而不等待服务器响应