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

时间:2017-08-03 10:34:10

标签: android delphi indy idhttp boringssl

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

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

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

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:6)

Indy的原生支持SSL / TLS在Android 6+上被破坏(好,不完整),因为Google在Android 6中放弃了对OpenSSL的支持,切换到他们自己的内部修改后的分叉名为BoringSSL:< / p>

Android 6.0 Changes - BoringSSL

  

Android正在从OpenSSL迁移到BoringSSL库。如果您在应用程序[Delphi Android应用程序中]使用Android NDK,请不要链接到不属于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。

答案 1 :(得分:2)

我尝试使用 TNetHTTPClient ,它可以与 HTTPS 协议一起使用。