我正在使用Delphi XE8和Indy 10进行Android应用程序开发。我已经使用TIdHTTP
组件进行HTTP / S服务调用。
它在Android 5及更早版本中运行良好,但在Android 6.0中无效(当我尝试访问HTTPS协议时)。
我尝试使用TIdSSLIOHandlerSocketOpenSSL
,但当我调用任何服务方法(如PUT,POST,GET)时,应用程序仍然崩溃。
请帮我解决这个问题。
答案 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),您必须:
使用Android应用程序部署Android的OpenSSL二进制文件(可从https://indy.fulgan.com/SSL/获得),并指示Indy在运行时从何处加载它们。但取决于设备和系统配置,这可能会也可能不会。人们对此事的结果好坏参半。
编写自己的TIdSSLIOHandlerSocketBase
派生类,它使用Java套接字API而不是C库BSD套接字和OpenSSL。
答案 1 :(得分:2)
我尝试使用 TNetHTTPClient ,它可以与 HTTPS 协议一起使用。